AcWing 93. !递归实现组合型枚举——有注释版
原题链接
简单
#include <iostream>
using namespace std;
const int N = 30;
int n, m;
bool b[N];
// 有连个状态参数
// u 代表搜索到数字 u 了
// t 代表还需要选择的数字的数量
void f(int u, int t){
// 当已搜索到n 或者 还未搜索到n 时
// 如果说t 已经变成 0 了,那么从头遍历数字
// 如果选了, 就输出出来
if (u <= n + 1 && t == 0){
for (int i = 1; i <= n; i ++)
if (b[i]) printf("%d ", i);
printf("\n");
return;
}else if (u == n + 1 && t != 0) return;
// 如果说已经从1 ~ n 搜索完了, t 的值还为 0 的话
// 就直接返回了
b[u] = true; // 选择该数
f(u + 1, t - 1);// 往下继续搜索, t 的值减少 1
b[u] = false; // 不选该数(恢复现场)
f(u + 1, t); // 往下继续搜索, t 的值不变
}
int main(){
scanf("%d%d", &n, &m);
f(1, m);
return 0;
}