1. 零钱兑换 II
在容量为 j 的情况下,有 dp [j] 种方法
dp[j] 表示:填满 j(包括j)这么大容积的包,有dp[j]种方法
确定了一个数(重量)nums[i],那么就还需要 j - nums[i] 才能装满,即有 dp[j - nums[i]] 种方法。
先遍历物品不会重复
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];
}
}
2. 组合总和 Ⅳ
顺序不同也算一种
先遍历背包,同一个物品就可能重复放入,顺序不同
class Solution {
public int combinationSum4(int[] nums, int target) {
int[] dp = new int[target + 1];
dp[0] = 1;
for(int j = 0; j <= target; j++){
for(int i = 0; i < nums.length; i++){
if(nums[i] <= j)
dp[j] += dp[j-nums[i]];
}
}
return dp[target];
}
}