递归实现组合型枚举

题目详情

从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。

输入格式

两个整数 n,mn,m ,在同一行用空格隔开。

输出格式

按照从小到大的顺序输出所有方案,每行1个。

首先,同一行内的数升序排列,相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如1 3 5 7排在1 3 6 8前面)。

数据范围

n>0 ,
0mn ,
n+(nm)25

输入样例:

5 3

输出样例:

1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5 

详细题解及说明

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int n,m;
 5 
 6 void dfs(int u,int sum,int state)//u:考虑到了第几个 sum:选了几个 state:为二进制数,用来存放当前的状态
 7 {
 8     if(u>n||sum+n-u<m)//如果选完了 或者 已选了的(sum)+还未选的(n-u)小于 要选的总数(m) 就退出
 9     {
10         return;
11     }
12     
13     if(sum==m) //满足条件,考虑完了n个 就输出
14     {
15         for(int i=0;i<n;i++)
16         {
17             if(state>>i&1)
18             {
19                 cout<<i+1<<" ";//因为从零开始循环,而数据是从1开始的,所以输出i+1
20             }
21         }
22         cout<<endl;
23         return;
24     }
25     
26     dfs(u+1,sum+1,state|1<<u);//选下一个数,因为要求按字典序输出,所以先搜索选的情况
27     dfs(u+1,sum,state);//不选下一个数
28 }
29 
30 int main()
31 {
32     cin>>n>>m;
33     dfs(0,0,0);
34      return 0;
35 }

 

 

 

posted @ 2019-08-12 22:11  幻鸩  阅读(377)  评论(0编辑  收藏  举报