代码随想录算法训练营 day 44: ● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

36 阅读1分钟

518. Coin Change II

完全背包问题,求组合数。递推公式: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];
    }
}