扩大
缩小

『模板』 子集生成

两种方法:

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 }

 

还有一种二进制法由于我不会某些原因以后懒得补上

先献上图片

 

posted @ 2018-02-27 20:50  luv_letters  阅读(198)  评论(2编辑  收藏  举报
AmazingCounters.com
博文导航目录