package com.demo.test;
public class LeastCoins {
private int coins(int[] coins, int amount) {
int[] dp = new int[amount + 1];
for (int i = 1; i < dp.length; i++) {
dp[i] = -1;
}
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int coin : coins) {
// 如果硬币面额 coin 大于需要的总额,不作考虑;dp[i - coin] 可以通过加上 coin 面额达到需要的总额
if (i >= coin && dp[i - coin] != -1) {
// 如果 dp[i] <= 0 说明是第一个可以组成 i 的情况,直接加上这个面额的 coin,否则取当前情况和前面情况的最小值
if (dp[i] > 0) {
dp[i] = Math.min(dp[i], dp[i - coin] + 1);
} else {
dp[i] = dp[i - coin] + 1;
}
}
}
}
return dp[amount];
}
public static void main(String[] args) {
int coins = new LeastCoins().coins(new int[]{1, 2, 5}, 12);
System.out.println(coins);
}
}