当前位置: 代码迷 >> 综合 >> 递归实现指数型枚举--ACwing 92.题解
  详细解决方案

递归实现指数型枚举--ACwing 92.题解

热度:51   发布时间:2023-12-06 01:17:59.0

题目:

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

输入格式

输入一个整数 nn。

输出格式

每行输出一种方案。

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

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

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

数据范围

1≤n≤15

输入样例:

3

输出样例:


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

 很明显这是递归三大类型之一:指数型枚举

所以我们可以有递归搜索树来实现,对于 1~n 中的每一个数,它都有两种情况:选了或没选。所以以此我们可以建立一个递归搜索树。

思路:

对于递归不熟练可以画对应的递归搜索树
按照**每个位置**考虑,每个位置有**三种状态**:未考虑、不填、填
对此可以用数组才存取每个位置的状态:未考虑为0,不填为2,填为1
对于状态改变注意恢复现场,这题因为状态会被覆盖所以可以不用恢复现场

代码实现:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;int st[16]; //记录状态,0-没考虑,1-选了,2-没选。
int N;void dfs(int n)
{if(n > N) //设置边界,输出。{for(int i = 1; i <= n; ++i)if(st[i] == 1) printf("%d ",i);printf("\n");return;}//st[n] = 2; //第一个分支--没选dfs(n + 1); //调用自己--进入下一个分支st[n] = 0; //回溯时要还原st[n] = 1;  //第二个分支--选了dfs(n + 1);st[n] = 0;
}int main()
{cin >> N;dfs(1);return 0;
}