递归实现指数型枚举
从 1∼n1∼n 这 nn 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式
输入一个整数 nn。
输出格式
每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。
对于没有选任何数的方案,输出空行。
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
数据范围
1≤n≤15
代码:
#include<iostream> using namespace std; const int N=16; int n; int st[N];//状态,记录每个位置当前的状态:0表示还没考虑,1表示选它,2表示不选它 void dfs(int u){ if(u>n){//表示已经到了边界 for(int i=1;i<=n;i++)//数据要求从1~n if(st[i]==1) cout<<i<<" "; cout<<endl; return; } st[u]=2; dfs(u+1);//第一个分支,不选 st[u]=0;//恢复现场:使父节点的状态,在另一种考虑时保持不变 st[u]=1; dfs(u+1);//第二个分支,选 st[u]=0; } int main(){ cin>>n; dfs(1); return 0; }