1、题目描述
2、解题思路
定义 dp[i] 表示对于组成金额 i 的最少硬币个数。
如果方案存在,那么至少有一个硬币至少出现了一次:
如果是第 0 个硬币出现了一次,则:dp[i] = dp[i-coins[0]] + 1
如果是第 1 个硬币出现了一次,则:dp[i] = dp[i-coins[1]] + 1
…
如果是第 coins.length-1 个硬币出现了一次,则:dp = dp[i-coins[coins.length-1]] + 1
我们从所有情况中选择最小的那个来赋值给 dp[i]
3、解题代码
class Solution {
public int coinChange(int[] coins, int amount) {
int nums = coins.length; // 硬币的个数
if (amount == 0) return 0; // 钱等于 0,最小硬币个数就是一个硬币都不包含
int[] dp = new int[amount + 1];
Arrays.fill(dp, amount + 1); // 先全部设置为 amount+1 给后面比较 min 时使用,相当于无穷大
dp[0] = 0; // base_case
for (int i = 1; i <= amount; i++) {
for (int coin : coins) {
if (i - coin >= 0) { // 金额 i 总得比硬币 coin 的面值大才能使用它
dp[i] = Math.min(dp[i], dp[i - coin] + 1);
}
}
}
return dp[amount] == amount + 1 ? -1 : dp[amount];
}
}