『模板』 子集生成
两种方法:
1.增量构造法
2.位向量法
(ps:懒得分开写就写一起了)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int zh[1001];//用于法一 4 bool xl[1001];//用于法二 5 void print(int s[],int n){ 6 for(int i=0;i<n;i++) //用于法二 7 if(xl[i]) cout<<s[i]<<' '; 8 cout<<endl; 9 } 10 void ps1(int s[],int n,int pos=0){ 11 for(int i=0;i<pos;i++){ //法一 12 cout<<zh[i]<<" "; 13 } 14 cout<<endl; 15 int m=pos ? zh[pos-1]:0; 16 for(int i=0;i<n;i++){ 17 if(s[i]>m){ 18 zh[pos]=s[i]; 19 ps1(s,n,pos+1); 20 } 21 } 22 } 23 void ps2(int s[],int n,int pos=0){ 24 if(pos==n){ 25 print(s,n);//法二 26 return 0; 27 } 28 xl[pos]=1; 29 ps2(s,n,pos+1); 30 xl[pos]=0; 31 ps2(s,n,pos+1); 32 } 33 int main(){ 34 int d[30000]; 35 int n,r; 36 cin>>n>>r; 37 for(int i=0;i<n;i++){ 38 d[i]=i+1; 39 } 40 ps1(d,n); 41 ps2(d,n); 42 return 0; 43 }
还有一种二进制法由于我不会某些原因以后懒得补上
先献上图片
“胡须如草芥疯长,悲欢不过梦一场”