//举例amount = 5, coins = [1, 2, 5]
public int change(int amount, int[] coins) {
//递推表达式
int[] dp = new int[amount + 1];
//初始化dp数组,表示金额为0时只有一种情况,也就是什么都不装
dp[0] = 1;
for(int i = 0;i < coins.length; i++) {//先遍历coins
//dp[j]:凑成总金额j的货币组合数为dp[j]
//第一轮外层for循环,表示考虑coins[0]==1
//凑成总金额1的货币组合数为dp[1] = dp[1] + dp[0]; (就是考虑1和不考虑1的情况之和)此时可能会想dp[1]值是什么,其实dp数组初始化的时候,值全为0了,所以这里dp[1] = dp[1] + dp[0] = 0 + 1 = 1
//当j++,后dp[2] = dp[2] + dp[2-1];(就是考虑2和不考虑2的情况之和)
//为什么这里要初始化j=coins[i]??
//考虑j=coins[1]的情况:此时j==2,则dp[2] = dp[2] + dp[2-2];dp[3] = dp[3] + dp[3-2];
//注意:此时可能会想到dp[3-2]值是多少?是0吗?不是,其实dp数组在上一轮外层for循环的时候就已经对dp数组赋予了新的值了,第二轮外层for循环只是在上一轮的基础之上改变值,dp数组就是个动态变化的数组
for(int j = coins[i]; j <= amount; j++) {
dp[j] += dp[j - coins[i]];
}
// //打印dp数组
// for(int i1 = 0; i1 < dp.length;i1++) {
// System.out.print(dp[i1]);
// }
// System.out.println();
}
return dp[amount];
}
零钱兑换II——【LeetCode】
于 2022-04-29 09:34:10 首次发布