LeetCode 216. Combination Sum III(DFS)

题目

题意:从1-9中选出k个数之和等于n,这个k个数不能有相同的,输出所有可能的k个数字的集合,结果也不能重复

题解:暴搜,从n开始,每次减去1-9中的某个数字,然后继续递归。要注意剪枝,比如1-9中的数字大于n/k的是不可能存在答案中的,如果n 的值小于sum[k]也是不会有答案的。sum[k]表示k个数字最小和的组合。当然k>=10的时候,也是没有答案的。

class Solution {
public:
    vector<vector<int>> res;
    vector<int> ans;
    map<int,int>m;
    int sum[10]={0,1,3,6,10,15,21,28,36,45};
    vector<vector<int>> combinationSum3(int k, int n) {
        
        if(k==0)
            return res;
        
        fun(n,k);
        
        return res;
        
    }
    
    void fun(int n,int k)
    {
        if(k==0)
        {
            if(n==0)
                res.push_back(ans);
            return;
        }

        
        if(n < sum[k] || k>=10)
            return;
        
        int i=1;
        if(ans.size()!=0)
            i = ans[ans.size()-1] + 1;
        for(;i<=9&&i<=n/k;i++)
        {
            if(m[i]!=0)
                continue;
            if(n<i)
                break;
            ans.push_back(i);m[i]=1;
            fun(n-i,k-1);
            ans.pop_back();m[i]=0;
        }
    }
};

猜你喜欢

转载自www.cnblogs.com/dacc123/p/12344825.html