题目描述:
方法1:回溯
class Solution {
public:
vector<vector<int>> result;
vector<int> data;
void backtrack(vector<int>& candidates,int target,int sum){
if(sum > target) return;
if(sum == target){
result.push_back(data);
return;
}
for(int i=0;i<candidates.size();i++){
sum += candidates[i];
data.push_back(candidates[i]);
backtrack(candidates,target,sum);
sum -= candidates[i];
data.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
backtrack(candidates,target,0);
return result;
}
};
出错:这样求出来不是组合,而是排列
修改:添加一个StartIndex参数
class Solution {
public:
vector<vector<int>> result;
vector<int> data;
void backtrack(vector<int>& candidates,int target,int sum,int StartIndex){
if(sum > target) return;
if(sum == target){
result.push_back(data);
return;
}
for(int i=StartIndex;i<candidates.size();i++){
sum += candidates[i];
data.push_back(candidates[i]);
backtrack(candidates,target,sum,StartIndex++);
sum -= candidates[i];
data.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
backtrack(candidates,target,0,0);
return result;
}
};
注:将StartIndex++ 改为 i也行,表示可以重复读取当前的数