92. 递归实现指数型枚举

从 1n1∼n 这 nn 个整数中随机选取任意多个,输出所有可能的选择方案。

输入格式

输入一个整数 nn。

输出格式

每行输出一种方案。

同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。

对于没有选任何数的方案,输出空行。

本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。

数据范围

1n151≤n≤15

输入样例:

3

输出样例:


3
2
2 3
1
1 3
1 2
1 2 3

理解

这道题用到了2进制优化,那么什么是二进制优化呢?我的理解就是将一串数字用01,也就是计算机的存储形式进行表示。不行,现在还是没有完全理解,我们看AC代码吧:

 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 int n;
 6 
 7 void dfs(int u, int state)
 8 {
 9     if(u == n)
10     {
11         for(int i = 0; i < n; i ++)
12         {
13             if(state >> i & 1)
14                 cout << i + 1 << ' ';
15         }
16         puts("");
17         return ;
18     }
19 
20     dfs(u + 1, state);
21     dfs(u + 1, state | 1 << u);
22 }
23 
24 void fs(int u, int state)
25 {
26     if(u == n)
27     {
28         for(int i = 0; i < n; i ++)
29         {
30             if(state >> i & 1) cout << i + 1 << ' ';
31         }
32         puts("");
33 
34         return ;
35     }
36 
37     fs(u + 1, state);
38 
39     fs(u + 1, state | 1 << u);
40 
41 }
42 
43 int main()
44 {
45     cin >> n;
46     fs(0, 0);
47     return 0;
48 }

 

posted @ 2022-09-22 15:55  Luli&  阅读(30)  评论(0)    收藏  举报