随想录训练营Day44 | DP - - 完全背包理论, 518.零钱兑换II, 377. 组合总和 Ⅳ

55 阅读1分钟

随想录训练营Day44(原day42) | DP - - 完全背包理论, 518.零钱兑换II, 377. 组合总和 Ⅳ

标签: LeetCode闯关记


完全背包理论

img_44_1.png

518.零钱兑换II

思路 img_44_2.png 通过打印区别排列数和组合数 img_44_3.png

class Solution {
    public int change(int amount, int[] coins) {
        int[] dp = new int[amount+1];
        for (int i : dp) {
            i = 0;
        }
        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];
    }
}

377. 组合总和 Ⅳ

思路: 完全背包 dp[i]表示组成总和为i的方法有dp[i]种,此为排列数 递推公式dp[i] += dp[i-nums[j]] 初始化:因为递推公式dp[i] += dp[i - nums[j]]的缘故,dp[0]要初始化为1,这样递归其他dp[i]的时候才会有数值基础。 遍历顺序: 先包后物品(排列数),正序(完全背包)

class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp = new int[target+1];
        dp[0] = 1;
        for (int i = 1; i <= target; i++) {
            for (int j = 0; j < nums.length; j++) {
                if(i >= nums[j]){
                    dp[i] += dp[i-nums[j]];
                }
            }
        }
        return dp[target];
    }
}