码迷,mamicode.com
首页 > 其他好文 > 详细

组合总数

时间:2021-04-21 12:09:31      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:pre   不同的   去重   can   signed   个数   重复   nat   target   

1.组合总数Ⅰ

原题链接

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。

注意点:

1.candidates 中的数字可以无限制重复被选取

2.解集不能包含重复的组合。

class Solution {
public:
    vector<int>tmp;
    vector<vector<int>>res;
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        dfs(candidates,target,0,0);
        return res;
    }
    void dfs(vector<int>&candidates,int target,int sum,int start)
    {
        if(sum==target) res.push_back(tmp);
        else 
        {
            for(int i=start;i<candidates.size();i++)
            {
                if(sum+candidates[i]<=target)
                {
                    tmp.push_back(candidates[i]);
                    dfs(candidates,target,sum+candidates[i],i);
                    tmp.pop_back();
                }
            }
        }
    }
};

2.组合总数Ⅱ

原题链接

注意点:

1.candidates 中的每个数字在每个组合中只能使用一次。

2.解集不能包含重复的组合。

class Solution {
public:
    vector<int>tmp;
    vector<vector<int>>res;

    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());//排序方便去重
        dfs(candidates,target,0,0);
        return res;
    }
    
    void dfs(vector<int>& candidates,int target,int sum,int start)
    {
        if(sum==target) res.push_back(tmp);
        else 
        {
            for(int i=start;i<candidates.size();i++)
            {
                if(sum+candidates[i]<=target)
                {
                    if(i>start&&candidates[i]==candidates[i-1]) continue;
                    tmp.push_back(candidates[i]);
                    dfs(candidates,target,sum+candidates[i],i+1);
                    tmp.pop_back();
                }
            }
        }
    }
};

3.组合总数Ⅲ

原题链接

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

注意点:

解集不能包含重复的组合。

class Solution {
public:
    vector<int>tmp;
    vector<vector<int>>ans;
    vector<vector<int>> combinationSum3(int k, int n) {
        dfs(k,n,0,1);
        return ans;
    }
    void dfs(int k,int n,int sum,int start)
    {
        if(sum==n&&tmp.size()==k)
            ans.push_back(tmp);
        else
        {
            for(int i=start;i<=9;i++)
            {
                tmp.push_back(i);
                dfs(k,n,sum+i,i+1);
                tmp.pop_back();
            }
        }
    }
};

4.组合总数Ⅳ

原题链接

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

注意点:

顺序不同的序列被视作不同的组合

状态表示:dp[i]表示以i结尾的组合数
状态计算:dp[i+nums[i]]+=dp[i]

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        vector<unsigned long long>dp(target+1,0);
        dp[0]=1;
        //先枚举中间状态
        for(int i=0;i<target;i++)
        {
            //枚举填数
            for(auto num:nums)
            {
                if(i+num<=target)
                    dp[i+num]+=dp[i];   
            }
        }
        return dp[target];
    }
};


组合总数

标签:pre   不同的   去重   can   signed   个数   重复   nat   target   

原文地址:https://www.cnblogs.com/Tsukinousag1/p/14678014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!