题目描述:

方法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也行,表示可以重复读取当前的数