AcWing 递归实现指数型枚举 dfs

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

输入格式

输入一个整数n。

输出格式

每行输出一种方案。

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

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

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

数据范围

1n15

输入样例:

3

输出样例:

3
2
2 3
1
1 3
1 2
1 2 3
预备知识:
  一个元素数量为n的集合的子集个数是2^n。
  证明:有n个元素,每个元素进行一次判断要不要把它选出来放进子集里,这样判断n次,产生了2^n种不同结果。
搜索的顺序:
  从前往后遍历1~n,依次判断每个数是选还是不选。
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int st[20]; //标记每一位有没有被选,0表示还没考虑,1表示选,2表示不选 
 5 void dfs(int u) { //u表示当前在判断第几位 
 6     if (u == n + 1) { //如果已经判断完了 
 7         for (int i = 1; i <= n; i++) {
 8             if (st[i] == 1) {
 9                 cout << i << " ";
10             }
11         }
12         cout  << endl;
13         return;
14     }
15     //不选u 
16     st[u] = 2;
17     dfs(u + 1);
18     st[u] = 0; //回溯恢复现场 
19     
20     //选u
21     st[u] = 1;
22     dfs(u + 1);
23     st[u] = 0; //回溯恢复现场 
24 }
25 int main() {
26     cin >> n;
27     dfs(1); //从下标为0开始搜索 
28     return 0;
29 } 

猜你喜欢

转载自www.cnblogs.com/fx1998/p/12760060.html