Day22——递归实现组合型枚举
从 1∼n 这 n 个整数中随机选出 m
个,输出所有可能的选择方案。
输入格式
两个整数 n,m
,在同一行用空格隔开。
输出格式
按照从小到大的顺序输出所有方案,每行 1
个。
首先,同一行内的数升序排列,相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7
排在 1 3 6 8
前面)。
数据范围
n>0
,
0≤m≤n ,
n+(n−m)≤25
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int N = 30;
int n,m;
int way[N];//读入方案
void dfs(int u, int start)//n为该枚举ways[]哪个位置,start为从1~n中哪个数开始枚举
{
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;
dfs(u + 1, i + 1);
way[u] = 0;//恢复现场,保证每个节点的出发状态相同
}
}
int main()
{
scanf("%d%d", &n, &m);//n是可供选择的所有数字个数,m是方案ways[]的数目
dfs(1, 1);
return 0;
}