输入一个数n,输出集合0,1,2,3,n-1的全部子集
方法一:增量构造法:
#include <iostream>
using namespace std;
void print_subset(int n,int *A,int cur){
for(int i=0;i<cur;i++)
cout<<A[i]<<" ";
cout<<endl;
int s=cur?A[cur-1]+1:0;
for(int i=s;i<n;i++){
A[cur]=i;
print_subset(n,A,cur+1);
}
}
int main(){
cout<<"请输入一个数,输出集合0,1,2,3,n-1的全部子集\n";
int n,cur=0;
cin>>n;
int A[100];
print_subset(n,A,cur);
}
方法二:位向量法
#include <iostream>
using namespace std;
void print_subset(int n,int *A,int cur){
if(cur==n){
for(int i=0;i<cur;i++)
if(A[i])cout<<i<<" ";
cout<<endl;
return;
}
A[cur]=1;
print_subset(n,A,cur+1);
A[cur]=0;
print_subset(n,A,cur+1);
}
int main(){
cout<<"请输入一个数,输出集合0,1,2,3,n-1的全部子集\n";
int n,cur=0;
cin>>n;
int A[100];
print_subset(n,A,cur);
}
二进制法
#include <iostream>
using namespace std;
void print_subset(int n,int s){
for(int i=0;i<n;i++)
if(s&(1<<i)) cout<<i;
cout<<endl;
}
int main(){
cout<<"请输入一个数,输出集合0,1,2,3,n-1的全部子集\n";
int n;
cin>>n;
for(int i=0;i<(1<<n);i++)
print_subset(n,i);
}