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;
}
}
};