核心思路
dp[i]:凑成金额i最少需要多少硬币- 转移:
dp[i] = min(dp[i], dp[i - coin] + 1) - 凑不出来就记为无穷大,最后返回
-1
通俗解释
1. 初始化
dp[0] = 0;
凑 0 元需要 0 个硬币。
其他 dp[i] 先设为 amount+1(表示暂时凑不出来)
2. 状态转移
for (每个金额 i) {
for (每个硬币 coin) {
if (coin 能用) {
// 不选 coin:保持 dp[i]
// 选 coin:dp[i - coin] + 1
dp[i] = 最小的那个
}
}
}
意思就是:要凑 i 元,可以在 i - coin 的基础上再加一枚 coin
3. 结果判断
return dp[amount] > amount ? -1 : dp[amount];
- 如果还是很大 → 凑不出来 → 返回 -1
- 否则就是最少硬币数
完整代码实现:
java
class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount + 1];
// 初始化一个比最大可能还大的值
for(int i = 1;i<=amount;i++){
dp[i] = amount + 1;
}
dp[0] = 0;
for(int i = 1;i<=amount;i++){
for(int coin : coins){
if(coin <= i){
dp[i] = Math.min(dp[i],dp[i -coin] + 1);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
}