Day44| Leetcode 518. 零钱兑换 II Leetcode 377. 组合总和 Ⅳ

今天进入完全背包。

Leetcode 518. 零钱兑换 II

题目链接 518 零钱兑换 II

由于是可以选取多个元素,所以是完全背包,要注意在遍历顺序中前序遍历,其他的和前面的目标数这个题目类似,要理解dpj+=dpj-nums\[i]的来源。(总体来是还是比较难想的)

下面上代码:

cpp 复制代码
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] += dp[j-coins[i]];
            }
        }
        return dp[amount];
    }
};

Leetcode 377. 组合总和 Ⅳ

题目链接 377 组合总和 Ⅳ

本题目就是上个题目的改版,这个要求的是排列数,所以我们只需先便利背包,在遍历物品即可(原因卡哥讲过),还要注意C++测试用例有两个数相加超过int的数据,所以需要在if里加上dpi < INT_MAX - dpi - num

直接上代码:

cpp 复制代码
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;i++){//遍历背包
            for(int j=0;j<nums.size();j++){//遍历物品
                if(i>=nums[j]&& dp[i] < INT_MAX - dp[i - nums[j]]){//C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。
                    dp[i] += dp[i-nums[j]];
                }
            }
        }
        return dp[target];
    }
};

end

相关推荐
Trouvaille ~1 分钟前
【Redis篇】Redis 事务:原子性与脚本执行机制
数据库·redis·后端·算法·junit·lua·原子性
飞天狗1113 分钟前
2024第十五届蓝桥杯c/c++B组国赛题解
c语言·数据结构·c++·算法·蓝桥杯
rsuhbsrjms16 分钟前
可视采耳仪器多少钱一台?可视耳勺哪个牌子好?口碑好的可视耳勺
网络·人工智能·算法
finhaz18 分钟前
神经网络等机器学习模型的看法
算法
z2005093019 分钟前
【linux学习】深入理解 Linux 下的静态库与动态库
开发语言·c++·算法
妄想出头的工业炼药师22 分钟前
腿式里程计
人工智能·算法·开源
SoftLipaRZC23 分钟前
C语言自定义类型:联合和枚举完全指南
c语言·算法
练习时长一年2 小时前
LeetCode热题100(二叉树的最大路径和)
算法·leetcode·职场和发展
2401_872418788 小时前
算法入门:数据结构-堆
数据结构·算法
xwz小王子10 小时前
手术机器人登上Science Robotics:2毫米纤细手臂,从3厘米切口完成腰椎神经减压
算法·机器人