
回溯模板
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表);
回溯,撤销处理结果
}
}
#include<iostream>
#include<vector>
using namespace std;
class Solution {
private:
vector<vector<int>> ans;
vector<int> temp;
void backtracking(int n, int k, int startNumb){
if (temp.size()==k){
ans.emplace_back(temp);
return ;
}
for (int i=startNumb; i<= n - (k - temp.size()) + 1; i++){
temp.emplace_back(i);
backtracking(n,k,i+1);
temp.pop_back();
}
}
public:
vector<vector<int>> combine(int n, int k) {
backtracking(n,k,1);
return ans;
}
};
int main(){
int n=5, k=2;
vector<vector<int>> ans;
Solution S;
ans=S.combine(n, k);
for (auto temp:ans){
for (auto i:temp){
cout<<i<<" ";
}
cout<<endl;
}
return 0;
}
结果:
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5