1、题目描述
从1到n这n个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式
输入一个整数n。
输出格式
每行输出一种方案。同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。对于没有选任何数的方案,输出空行。各行(不同方案)之间的顺序任意。
数据范围
1n
15
输入样例
4
输出样例
4 3 3 4 2 2 4 2 3 2 3 4 1 1 4 1 3 1 3 4 1 2 1 2 4 1 2 3 1 2 3 4
2、题目解析
如下如,采用dfs深度递归搜索树,加入n=3时,按照每一位选和不选的方法,可以进行递归,直到遍历到最后一位。那么具体实现细节,就是,用一个全局的状态数组,记录每一位的状态。
下面上代码(时间复制度O(2^n)):
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int N = 15;
int n;
int state[N] = {2}; // 2表示未遍历,0表示未选择,1表示选择了
void dfs(int m){
if(m > n){ // 深度递归到底部,结束递归,并输出
for(int i = 1;i <= n;++i){
if(state[i] == 1)
printf("%d ",i);
}
getchar();
printf("\n");
return;
}
state[m] = 0; // 左分支,先不选择
dfs(m + 1); // 继续深度递归
state[m] = 2; // 遍历结束后,退回到上一层,恢复现场
state[m] = 1; // 右分支,选择
dfs(m + 1); // 继续深度递归
state[m] = 2; // 遍历结束后,退回到上一层,恢复现场
}
int main()
{
scanf("%d",&n);
dfs(1);
return 0;
}