题二:递归实现指数型枚举
从 1∼n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式:
输入一个整数 n。
输出格式:
每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好 1 个空格隔开。
对于没有选任何数的方案,输出空行。
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
数据范围
1≤n≤15
输入样例:
3
输出样例:
3
2
2 3
1
1 3
1 2
1 2 3
题解:
数据范围只有1~9,可以用复杂度指数级别的算法,dfs剪枝、状态压缩dp,这题考虑用dfs解决。
#include<stdio.h>
//变量说明
const int N=16;
int state[N];//选择状态数组,0表示该数未操作,1表示选,2表示不选;
int n;
void dfs(int u){
if(u>n){//函数出口,当递归到u=n时说明分支遍历结束,进行存储或者输出
for(int i=1;i<=n;i++){
if(state[i]==1)//解析存储数组st
printf("%d ",i);
}
printf("\n");
return;
}
//左分支,1表示不选
state[u]=1;
dfs(u+1);
state[u]=0;//回退时还原现场
//右分支,2表示选
state[u]=2;
dfs(u+1);
state[u]=0;//回退时还原现场
}
int main(){
scanf("%d",&n);
dfs(1);//此处一表示从第一个位置开始
return 0;
}