完全背包问题,求组合数。递推公式:dp[j] += dp[j - coins[i]];
class Solution {
public int change(int amount, int[] coins) {
if(amount == 0) {
return 1;
}
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]];
//System.out.println(Arrays.toString(dp));
}
}
return dp[amount];
}
}
377. Combination Sum IV 组合总和。说是combination其实求的是排列数。 如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
class Solution {
public int combinationSum4(int[] nums, int target) {
if(nums.length == 0) {
return 0;
}
int[] dp = new int[target + 1];
dp[0] = 1;
for(int i=0; i<=target; i++) {
for(int j=0; j<nums.length; j++) {
if(i>=nums[j]) {
dp[i] += dp[i-nums[j]];
}
//System.out.println(Arrays.toString(dp));
}
}
return dp[target];
}
}