首页 > 编程语言 >算法刷题 Day 44 | ● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

算法刷题 Day 44 | ● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

时间:2023-02-20 15:12:20浏览次数:53  
标签:遍历 E5% 44 II 518 int 背包 com dp

力扣上没有纯粹的完全背包的题目,所以大家看本篇了解一下 完全背包的理论

后面的两道题目,都是完全背包的应用,做做感受一下

完全背包

视频讲解:https://www.bilibili.com/video/BV1uK411o7c9

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

视频讲解:https://www.bilibili.com/video/BV1KM411k75j

https://programmercarl.com/0518.%E9%9B%B6%E9%92%B1%E5%85%91%E6%8D%A2II.html

Tips:记得要把dp[0]初始化成1

难点在于遍历顺序!

在求装满背包有几种方案的时候,认清遍历顺序是非常关键的。

如果求组合数就是外层for循环遍历物品,内层for遍历背包

如果求排列数就是外层for遍历背包,内层for循环遍历物品

我的题解:

class Solution {
public:
    int change(int amount, vector<int>& coins) {
        vector<int> dp(amount+1,0);
        dp[0] = 1;
        for(int i = 0; i<coins.size(); i++){
            for(int j = coins[i]; j <= amount; j++){
                dp[j] += dp[j - coins[i]];
            }
        }
        return dp[amount];
    }
};

377. 组合总和 Ⅳ

视频讲解:https://www.bilibili.com/video/BV1V14y1n7B6

https://programmercarl.com/0377.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C%E2%85%A3.html

Tips:这道题和上一道正好互为补充,求的就是排列数。因此遍历顺序是外层for遍历背包,内层for循环遍历物品。

C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。

我的题解:

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

标签:遍历,E5%,44,II,518,int,背包,com,dp
From: https://www.cnblogs.com/GavinGYM/p/17137504.html

相关文章