回溯可以解决的问题:
组合问题、切割问题、子集问题、排列问题、棋盘问题
回溯法模板:
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
第77题. 组合
题目:力扣
class Solution {
public:
vector<vector<int> > ans;
void backtracking(vector<int>& x,int first,int n, int k){
if(x.size() == k){
ans.push_back(x);
return;
}
for(int i = first; i <= n - (k - x.size()) + 1; i++){
x.push_back(i);
backtracking(x,i + 1,n,k);
x.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
vector<int> x;
backtracking(x,1,n,k);
return ans;
}
};