实现比较简单,主要复习一下剪枝的方法:
-
优先搜索结果小的分支
-
排除等效冗余
-
可行性剪枝
-
最优剪枝
-
记忆化DP
这里基本就是一个暴力搜索的问题,只能用到可行性剪枝。
#include <iostream>
#include <vector>
using namespace std;
const int N = 30;
int n,m;
int path[N];
void dfs(int u,int idx) {
if(n - idx + u + 1 < m) return;
if(u == m) {
for(int i = 0;i < m;i++) cout << path[i] << ' ';
cout << endl;
return;
}
for(int i = idx;i <= n;i++) {
path[u] = i;
dfs(u + 1,i + 1);
path[u] = 0;
}
}
int main(){
// freopen("input.txt","r",stdin);
cin >> n >> m;
dfs(0,1);
return 0;
}