关于回溯算法的两个模板
1、模板1(带for循环)
具体应用可以参考leedcode第77题的解答:解答链接
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
2、模板2(选择or不选择)
具体应用可以参考leedcode第39题的解答:题目解答链接https://leetcode.cn/problems/combination-sum/solution/zu-he-zong-he-by-leetcode-solution/
vector<int> temp;
void dfs(int cur, int n) {
if (cur == n + 1) {
// 记录答案
// ...
return;
}
// 考虑选择当前位置
temp.push_back(cur);
dfs(cur + 1, n, k);
temp.pop_back();
// 考虑不选择当前位置
dfs(cur + 1, n, k);
}