还是回溯法:
class Solution {
public:
vector<vector<int>> res;
vector<int> tmp;
int n, k;
//i表示当前选的数字,sum表示当前和,cnt表示当前选了多少个
void backtrack(int i, int sum, int cnt){
if(sum == n && cnt == k){
res.push_back(tmp);
return;
}
if(sum >= n || cnt >= k) return;//剪枝
for(int j = i + 1; j <= 9; ++j){
tmp[cnt] = j;
backtrack(j, sum+j, cnt+1);
tmp[cnt] = 0;
}
}
vector<vector<int>> combinationSum3(int k, int n) {
this->k = k;
this->n = n;
tmp = vector<int>(k, 0);
backtrack(0, 0, 0);
return res;
}
};