acwing指数型枚举
题目
从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式
输入一个整数n。
输出格式
每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。
对于没有选任何数的方案,输出空行。
数据范围
1≤n≤15
输入样例:
3
输出样例:
3
2
2 3
1
1 3
1 2
1 2 3
分析
这道题最关键的地方就是选与不选,1~n中随机的选任意多个数,那么每个数就都处于选与不选,我们用递归来做,那么就要记录下,递归到第几个数了,定义一个数组st[i]来记录当前数是选还是不选,选,当前状态st[i]赋初始值为1,不选,默认初始值为0
小知识,数组的全局变量,int类型默认为0,bool类型默认为false~
#include<iostream>
using namespace std;
const int N=16;
int st[N];//记录当前状态,选还是不选
int n;
void dsf(int u)
{
if(u>n){
for(int i=1;i<=n;i++)
{
if(st[i]==1)
cout<<i<<" ";
}
cout<<endl;
return;
}
st[u]=1;//表示选
dsf(u+1);
st[u]=0;//表示不选
dsf(u+1);
}
int main(){
cin>>n;
dsf(1);
return 0;
}
改进代码
#include<iostream>
using namespace std;
int n;
void dsf(int u,int state)//定义一个state是一个二进制数,用来存放当前位置选还是不选
{
if(u>n){
for(int i=1;i<=n;i++)
{
if(state>>i&1)//判断第i个位置是否是1
cout<<i<<" ";
}
cout<<endl;
return;
}
dsf(u+1,state|1<<u);//选,就把当前第u个位置置为1
dsf(u+1,state);//不选,当前状态不变
}
int main(){
cin>>n;
dsf(1,0);
return 0;
}