class Solution {
public:
vector<vector<int> > combinationSum(vector<int>& candidates, int target) {
this->candidates = candidates;
sort(this->candidates.begin(), this->candidates.end());
// tmpres保存目前已经选择的元素
vector<int> tmpres;
helper(target, 0, tmpres);
return ret;
}
//target是目前的目标数,从start位置继续选择
void helper(int target, int start, vector<int> &tmpres) {
//成功找到一个组合
if (target == 0) {
ret.push_back(tmpres);
return;
}
//因为数组已经排序,所以下面两种情况都表示本次选择失败了
if (candidates[start] > target || start == candidates.size())
return;
// 不要start位置的元素,继续从下一位置选择
helper(target, start + 1, tmpres);
// 要start位置的元素,可能匹配多次,不移动start
tmpres.push_back(candidates[start]);
target = target - candidates[start];
helper(target, start, tmpres);
//回溯是必须的,上面的调用已经修改了tmpres
tmpres.pop_back();
}
private:
vector<vector<int> > ret;
vector<int> candidates;
};