这是完全背包问题,其中背包的容量就是 amount, 物品就是硬币,其中物品的数量是无限个的,而物品的重量,这里就是硬币的价值。因此 dp[i][j] 表示的是 前i个硬币可以凑成价值为 j 的钱数 的总的方法数。状态转移方程就是 dp[i][j] = dp[i-1][j] + dp[i][j - coins[i-1]] ,
dp[i-1][j] 表示:(不用这第i个硬币)只用 前 i-1 中硬币就可以凑出价值为 j 的总数,
dp[i][j- coins[i-1]]表示 : 要用这第i个硬币,那么就要关注如何凑出价值 j-coins[i-1]这个钱数的方法。
题目 code注意:1.区分状态转移方程:dp[i][j] = dp[i - 1][j] + dp[i-1][j - nums[i - 1]]; 和
dp[i][j] = dp[i - 1][j] + dp[i][j - nums[i - 1]];
这里面的零钱可以重复选择,所以选了这个零钱之后,dp[i][j] = dp[i][j- nums[i-1]]
如果不可以重读选择 就是 dp[i][j] = dp[i - 1][j] + dp[i-1][j - nums[i - 1]]
2.j有时候要从0开始
3.降维的时候,j要倒着算,从j = sum开始减
网友评论