图1:
图2:
结合上面的图进行学习
重点:dfs()参数个数,以及各参数含义
剪枝:if (n + n - start < m) return ;
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 30; //n+n-m<=25组合数取中间点是最大值
int n, m;
int way[N];
void dfs(int u, int start) {
if (n + n - start < m) return ; //剪枝
if (u == m + 1) { //表示已经选了m-1个数
for (int i = 1; i <= m; i ++) {
printf("%d ", way[i]);
}
puts("");
return ;
}
for (int i = start; i <= n; i ++) { //从start开始枚举
way[u] = i; //每次把的当前枚举的数放到way[]中
dfs(u + 1, i + 1);
way[u] = 0;
}
}
int main () {
cin >> n >> m;
dfs(1, 1); //应该有3个参数,但是way是全局变量就不用传了
return 0;
}
时间复杂度分析见 P蓝桥6