【题目描述】
从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案
【输入格式】
输入一个整数n
【输出格式】
每行输出一种方案
同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开
对于没有选任何数的方案,输出空行
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意
【数据范围】
1 ≤ n ≤ 15
【题目分析】
由题意可知,输出需要是升序排列,从1~n呢每一个数都有2种可能,可以要它也可以不要它,所以总共的方案数量就是2的n次方,时间复杂度是o(2的n次方*n)
以2个数用递归思想举例:
边界:最后一个数n为止
从1开始一直到n,再超过n之后会结束,并且每个数都有3个状态,分别为:
<1>还没有轮到,未选定的状态,我们将这个状态定为0
<2>已经被选择要了,这是我们要输出的,我们将这个状态定为1
<3>已经被选择不要了,我们将这个状态定为2
#include <iostream>
using namespace std;
const int N = 20;
int st[N];
void dfs(int a, int b, int st[])
{
if(a > b) //边界
{
for(int i = 1; i <= b ; i++ ) //升序排列
{
if(st[i] == 1 ) cout << i << " "; //1就代表是我们要的,输出就完事了
}
cout << endl; //刚好可以多输出一个空行
return ; //一定要return 不然无休无止了
}
st[a] = 1; //假设选择要
dfs(a+1, b, st); //下一位数
st[a] = 2; //假设选择不要
dfs(a+1, b, st);
}
int main()
{
int n;
cin >> n;
dfs(1, n, st);
return 0;
}