子集生成
1 //2016.8.31 2 #include <iostream> 3 #include <cstdio> 4 5 using namespace std; 6 7 void print_subset(int n, int *a, int cur)//增量构造法 8 { 9 for(int i = 0; i < cur; i++)cout<<a[i];//打印当前集合,即选出的元素序号 10 cout<<endl; 11 int tmp = cur?a[cur-1]+1:0;//确定当前元素的最小可能值 12 for(int i = tmp; i < n; i++) 13 { 14 a[cur] = i; 15 print_subset(n, a, cur+1);//递归构造子集 16 } 17 } 18 19 void print_subset2(int n, int *b, int cur)//位向量法 20 { 21 if(cur==n){//打印 22 for(int i = 0; i < n; i++) 23 if(b[i])cout<<i; 24 cout<<endl; 25 return ; 26 } 27 b[cur] = 1;//选择第cur个元素 28 print_subset2(n, b, cur+1); 29 b[cur] = 0;//不选择第cur个元素 30 print_subset2(n, b, cur+1); 31 } 32 33 void print_subset3(int n)//二进制法,A&B,A|B,A^B分别对应集合A和B的交、并、对称差 34 { 35 for(int s = 0; s < (1<<n); s++){ 36 for(int i = 0; i < n; i++) 37 if(s&(1<<i))cout<<i; 38 cout<<endl; 39 } 40 } 41 42 int main() 43 { 44 int a[4], b[4]; 45 print_subset(4, a, 0); 46 cout<<"--------------------------------------"<<endl; 47 print_subset2(4, b, 0); 48 cout<<"--------------------------------------"<<endl; 49 print_subset3(4); 50 return 0; 51 }