思路
限制:保持升序选择
只需要保证每次新加的数大于前面的一个数(a1<a2,a2<a3........)
优化:减枝(4、5无解)
C++ 代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N = 30;
int n, m;
int way[N];//记录是第几个数
void dfs(int u,int start) {//u表示当前是第几个数,start是当前数字从几开始枚举
if (u + n - start < m) return;//优化(去除4、5)
if (u == m + 1) {//边界
for (int i = 1; i <= m; i++) printf("%d ", way[i]);
puts("");
return;
}
for (int i = start; i <= n; i++) {
way[u] = i;//把i放到当前这个数里面
dfs(u + 1, i + 1);//下一个从i+1开始枚举
//恢复现场
way[u] = 0;//可以省略(后面可以覆盖掉)
}
}
int main() {
scanf("%d%d", &n, &m);
dfs(1,1);
return 0;
}