题目描述:

方法1:回溯,注(for循环中,回溯时,记得加上sum -= i

class Solution {
public:
    vector<int> data;
    vector<vector<int>> result;

    void backtrack(int n,int k,int sum,int StartIndex){
        if(data.size()==k){
            if(sum==n) result.push_back(data);
            return;
        }
        for(int i=StartIndex;i<=9;i++){
            data.push_back(i);
            sum += i;
            backtrack(n,k,sum,i+1);
            sum -= i;
            data.pop_back();
        }
    }

    vector<vector<int>> combinationSum3(int k, int n) {
        backtrack(n,k,0,1);
        return result;
    }
};

优化,引入剪枝操作,除了通过k限制for循环次数,sum > n 时,也没有必要继续循环

class Solution {
public:
    vector<int> data;
    vector<vector<int>> result;

    void backtrack(int n,int k,int sum,int StartIndex){
        if(sum > n)return; //剪枝操作
        if(data.size()==k){
            if(sum==n) result.push_back(data);
            return;
        }
        for(int i=StartIndex;i<=9-(k-data.size())+1;i++){ //剪枝操作
            data.push_back(i);
            sum += i;
            backtrack(n,k,sum,i+1);
            sum -= i;
            data.pop_back();
        }
    }

    vector<vector<int>> combinationSum3(int k, int n) {
        backtrack(n,k,0,1);
        return result;
    }
};