leetcode 377. Combination Sum IV

这道题也是完全背包问题。这道题和第518题几乎一摸一样,所不同的是,第518题要求的是组合数,而第377题要求的是排列数。虽然本题题目描述中说求的是组合数,但从例子1中(1,1,2)和(2,1,1)被当作两个不同的组法可以看出实际上求的是排列数。求排列数,外层循环必须是对背包容量进行遍历,内层循环必须是对物品遍历。

和第518题一样,存在中间结果整数溢出的问题,需特别处理。

cpp 复制代码
class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        int n = nums.size();
        //dp[j]表示从nums中选若干个数使得总和等于j的选法数,相同的数字顺序不同代表不同的选法
        //dp数据类型使用double可以避免中间结果整数溢出无法通过部分测试用例的情况
        vector<double> dp(target+1,0);//除dp[0]外都初始化为0,表示从0个数中没有办法选到若干个数使得所选数的总和大于0。
        dp[0] = 1;//初始情况下,从0个数,选0个数,使得所选数的总和等于0,有1种选法,那就是不选,不选也是一种选法。
        for(int j = 0;j <= target;j++){
            for(int i = 0;i < n;i++){
                if(j>= nums[i])
                dp[j] = dp[j] + dp[j-nums[i]];
            }
        }
        return dp[target];
    }
};

严谨的做法

cpp 复制代码
class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        int n = nums.size();
        //valid[j]表示能否选若干个数使得所选数的总和等于j
        vector<bool> valid(target+1,false);
        valid[0] = true;
        for(int j = 0;j <= target;j++){
            for(int i = 0;i < n;i++){
                if(j >= nums[i])
                    valid[j] = valid[j] || valid[j - nums[i]];
            }
        }
        if(!valid[target]) return 0;
        //dp[j]表示从nums中选若干个数使得总和等于j的选法数,相同的数字顺序不同代表不同的选法
        //dp数据类型使用double可以避免中间结果整数溢出无法通过部分测试用例的情况
        vector<double> dp(target+1,0);//除dp[0]外都初始化为0,表示从0个数中没有办法选到若干个数使得所选数的总和大于0。
        dp[0] = 1;//初始情况下,从0个数,选0个数,使得所选数的总和等于0,有1种选法,那就是不选,不选也是一种选法。
        for(int j = 0;j <= target;j++){
            for(int i = 0;i < n;i++){
                if(j>= nums[i])
                dp[j] = dp[j] + dp[j-nums[i]];
            }
        }
        return dp[target];
    }
};
相关推荐
程序员-King.19 小时前
day158—回溯—全排列(LeetCode-46)
算法·leetcode·深度优先·回溯·递归
月挽清风20 小时前
代码随想录第七天:
数据结构·c++·算法
小O的算法实验室20 小时前
2026年AEI SCI1区TOP,基于改进 IRRT*-D* 算法的森林火灾救援场景下直升机轨迹规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小郭团队20 小时前
2_1_七段式SVPWM (经典算法)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·硬件架构·arm·dsp开发
充值修改昵称21 小时前
数据结构基础:从二叉树到多叉树数据结构进阶
数据结构·python·算法
Deepoch21 小时前
Deepoc数学大模型:发动机行业的算法引擎
人工智能·算法·机器人·发动机·deepoc·发动机行业
浅念-21 小时前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法
Hcoco_me1 天前
大模型面试题84:是否了解 OpenAI 提出的Clip,它和SigLip有什么区别?为什么SigLip效果更好?
人工智能·算法·机器学习·chatgpt·机器人
BHXDML1 天前
第九章:EM 算法
人工智能·算法·机器学习
却道天凉_好个秋1 天前
目标检测算法与原理(三):PyTorch实现迁移学习
pytorch·算法·目标检测