每个数选与不选都有两种,时间复杂度O(2^n)
题目:
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=16;
int n,s[N]; //s[]表示每个位置的状态 0表示还没考虑,1表示选,2表示不选
void d(int x){
if(x>n){
for(int i=1;i<=n;i++){
if(s[i]==1) printf("%d ",i); //选
}
puts(""); //回车
return;
}
//分支过程
s[x]=2; //第一个分支,不选
d(x+1); //递归到下一个位置
s[x]=0; //恢复现场
s[x]=1; //第二个分支,选
d(x+1);
s[x]=0;
}
int main(){
cin>>n;
d(1); //传入当前枚举到第几位
return 0;
}