@Leetcode
相对于组合问题,只是多了一个限制,即所求集合总和为n;
回溯三步曲
- 确定递归函数参数
void generateSum(int k, int n, int sum, int startIndex,
vector &p)
- 确定终止条件
if(p.size() == k){
if(sum == n)
res.push_back(p); //如果相等,则入数组
return;//否则返回
}
- 单层搜索过程
for(int i = startIndex; i <= 9 - (k - p.size()) + 1; i++){
if(sum + i <= n){
sum = sum + i;
p.push_back(i);
generateSum(k, n, sum, i+1, p);
sum -= i;
p.pop_back();
}
}
全部代码
class Solution {
private:
vector<vector<int>> res;
void generateSum(int k, int n, int sum, int startIndex, vector<int> &p){
if(p.size() == k){
if(sum == n)
res.push_back(p);
//for(int i = 0; i < p.size(); i++)
//cout<<p[i];
//cout<<endl;
return;
}
for(int i = startIndex; i <= 9 - (k - p.size()) + 1; i++){
if(sum + i <= n){
sum = sum + i;
p.push_back(i);
generateSum(k, n, sum, i+1, p);
sum -= i;
p.pop_back();
}
}
return;
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
int sum = 0;
vector<int> p;
generateSum(k, n, sum, 1, p);
return res;
}
};