题目描述:
标签:动态规划
给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。
代码:
思路分析:动态规划五部曲(完全背包问题)
1、确定dp数组以及下标的含义——这里dp[i]是指背包重量是i,凑成该重量的方法数
2、确定递推公式,典型背包公式递推,dp[j] += dp[j-coins[i]]——一维,滚动数组(说真的我没有理解这个公式)
3、dp数组初始化,dp[0]=1,不放东西也是一种方法
4、确定遍历顺序,双层for循环遍历,i从0到coins.length(遍历所有硬币),j从当前硬币重量coins[i]到需要的总重量amount
5、举例推导dp数组
6、最后返回dp[amount]
class Solution {
public int change(int amount, int[] coins) {
int[] dp = new int[amount+1];
dp[0] = 1;
for(int i = 0;i < coins.length;i++){
for(int j = coins[i];j <= amount;j++){
dp[j] += dp[j-coins[i]];
}
}
return dp[amount];
}
}