题目
描述
从 1~n 这 n(n<16) 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式
一个整数n。
输出格式
每行一种方案。同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。对于没有选任何数的方案,输出空行。
思路
1~n这n个整数中,每个整数都会有两种情况:选还是不选,所以总共有2^n种选择,这就是为什么这道题的题目叫做递归实现指数类型的枚举。
-
枚举 通过位运算实现枚举
核心函数
dfs(int number1,int state)
其中第一个参数number1指参与选择的整数个数,第二个参数代表在参与选择的争整数中是否被选择。
例如dfs(1,1)说明参与选则的整数就一个,而且还是被选中的状态
-
通过枚举在不同整数个数下的选取情况,将每个状态输出
代码
#include<bits/stdc++.h>
using namespace std;
int n;
void dfs(int number1,int state)
{
if(number1==n+1)//说明已经考虑到数字n了
{
for(int i=1;i<=n;i++)
{
if(state>>i&1)//state记录着这一支的状态 ,判断第i个数是否被选上
{
cout<<i<<' ';
}
}
cout<<endl;
return;
}
dfs(number1+1,state);//这个数没有将它选择
dfs(number1+1,state|1<<number1);//这个数被选择,并将其状态置为1
//1<<number1表示第number1位
}
int main()
{
cin>>n;
dfs(1,1);
}