这道题是典型的背包问题,我习惯使用dp问题的解答思路来实现
想要直到目前钱数最少的组合次数,就要直到前一个额度的最少组合次数
比如说现在的钱数有2,5,要组合的钱数是11
那么dp[11]的前一个状态是什么呢,可以是dp[10],可以是dp[9]
但是这里我们要考虑,之前的这个dp值可能是不存在的,也就是可能前面有一个值是凑不出来的,所以我们需要有一个if判断
java
class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount+1];
Arrays.fill(dp,Integer.MAX_VALUE);
dp[0] = 0;
for(int coin : coins){
for(int j = coin ; j <= amount; j++) {
if(dp[j-coin] != Integer.MAX_VALUE) dp[j] = Math.min(dp[j], dp[j-coin]+1);
}
}
return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
}
}