39.组合总和
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtrace(const vector<int>& candidates, int target,int start) {
if (target == 0) {
result.push_back(path);
return;
}
if (target < 0) {
return;
}
for (int i = start; i < candidates.size(); i++) {
path.push_back(candidates[i]);
target -= candidates[i];
backtrace(candidates, target,i);
path.pop_back();
target += candidates[i];
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
backtrace(candidates, target,0);
return result;
}
};

相较于之前的题目,数组中的元素同一个数字可以无限制重复被选取,我们就得保证当前元素在下一次选择中依旧可以选择自己。要记住这是一道组合题,后续的元素是不能往前看的,即不能再选择之前的元素。要想同时达到前面两个条件,我们的做法是 传递到 backtrace 中的 start 参数 不在 自加,既 传递 i 作为参数,而不是 i + 1 作为参数。

为什么组合中,其后的元素不能往前看,即不能再选择之前的元素?

因为我们的回溯会把当前元素和后面的元素所有可能都尝试一遍,而组合不强调顺序性,这就是为什么组合中其后的元素没有必要往前看。