代码随想录算法训练营第三十八天|完全背包, 518. 零钱兑换 II ,377. 组合总和 Ⅳ

 完全背包 

视频讲解:带你学透完全背包问题! 和 01背包有什么差别?遍历顺序上有什么讲究?_哔哩哔哩_bilibili

https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85.html 

 518. 零钱兑换 II  

视频讲解:动态规划之完全背包,装满背包有多少种方法?组合与排列有讲究!| LeetCode:518.零钱兑换II_哔哩哔哩_bilibili

代码随想录

递推公式来源的解释:

代码随想录算法训练营第三十八天|完全背包, 518. 零钱兑换 II ,377. 组合总和 Ⅳ_第1张图片

class Solution {
    public int change(int amount, int[] coins) {
        int dp[] = new int[amount + 1]; //dp数组含义 : dp[i]应该表示组成金额i的组合数
        dp[0] = 1; //不使用任何硬币也能达到所以是1种
        for (int i = 0; i < coins.length; i++) {
            for (int j = coins[i]; j <= amount; j++) {
                dp[j] = dp[j] + dp[j - coins[i]];
            }
        }
        return dp[amount];
    }
}

 377. 组合总和 Ⅳ  

视频讲解:动态规划之完全背包,装满背包有几种方法?求排列数?| LeetCode:377.组合总和IV_哔哩哔哩_bilibili

代码随想录

这道题要注意顺序问题了

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];
    }
}

你可能感兴趣的:(算法)