题解:
class Solution {
public:
// 回溯法:每次Select选择时传入当前的深度height和目标值target以及开始start,当深度与目标值符合要求是,结束本次
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>> result;
vector<int> tempresult;
Select(k,1,n,1,tempresult,result);
return result;
}
void Select(int k,int height,int target,int start,vector<int> &tempresult,vector<vector<int>> &result){
// 满足要求
if(height==k+1 && target==0){
result.push_back(tempresult);
return;
}
// 超过k个和剩下的数字不能完成两种情况都剪枝
if(height==k+1 || target<start){
return;
}
for(int i=start;i<10;i++){
tempresult.push_back(i); //选择
Select(k,height+1,target-i,i+1,tempresult,result);
tempresult.pop_back();// 恢复
}
}
};