和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili
这个是我刚开始画的递归回溯图,这个图需要取3次值,再去回溯。
然后看了代码随想录画的图: 假设n=4,k=2
class Solution { public: vector<int> temp; vector<vector<int>> result;
int sum=0;
void backtracking(int index, int k, int n) {//index初始值为1 k为深度,控制沿途取多少个值 n控制结束条件
//循环结束条件
if (temp.size() == k && sum== n) {
result.push_back(temp);
return;
}
//单层搜索逻辑
for (int i = index; i <= 9; i++) { //i<=9,控制宽度最大为9
sum+=i;
temp.push_back(i);
backtracking(i + 1, k, n);
sum-=i;
temp.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(1, k, n);
return result;
}
};
优化
class Solution { public: vector<int> temp; vector<vector<int>> result;
void backtracking(int index, int k, int n) {//index初始值为1 k为深度,控制沿途取多少个值 n控制结束条件
if(sum>n)return;//剪枝操作,可有可无
//循环结束条件
if (temp.size() == k && accumulate(temp.begin(), temp.end(), 0) == n) {
result.push_back(temp);
return;
}
//单层搜索逻辑
for (int i = index; i <= 9; i++) { //剪枝操作
temp.push_back(i);
backtracking(i + 1, k, n);
temp.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(1, k, n);
return result;
}
};
//accumulate为STL的一个容器,用来计算其他容器的和。需要三个参数,起始位置,结束位置,初始值