代码随想录算法训练营-day44-518. 零钱兑换 II、377. 组合总和 Ⅳ

518. 零钱兑换 II

  1. 学习文章链接:
  2. 思路:注意完全背包与01背包的遍历顺序,注意递推公式。
  3. 代码:
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++) {
            // 注意遍历顺序,从小到大,与01背包中内层的遍历顺序不同。
            for (int j = coins[i]; j <= amount; j++) {
                // 组合总和问题,是累加。
                dp[j] += dp[j - coins[i]];
            }
        }
        return dp[amount];
    }
}

377. 组合总和 Ⅳ

  1. 学习文章链接:
  2. 思路:这次应该叫排列总和,排列总和一定要先遍历背包,然后遍历物品。
  3. 代码:
class Solution {
    public int combinationSum4(int[] nums, int target) {
        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]];
            }
        }
        return dp[target];
    }
}

你可能感兴趣的:(代码随想录算法训练营,算法,动态规划,贪心算法)