子集生成

输入一个数,生成0到n-1 的所有子集:

方法一:增量构造

//----增量构造法----//
void print_subset_1(int cur){  //cur现在的长度
    for(int i=0; i<cur; ++i)  printf("%d ", subset[i]);
    if(cur != 0) printf("\n");
    int start = cur ? subset[cur-1]+1 : 0;
    for(int i=start; i<n; ++i){
        subset[cur] = i;
        print_subset_1(cur+1);
    }
}

 

方法二:位向量法

//----位向量法----//
void print_subset_2(int cur){  //cur现在的长度
    if(cur == n){
        for(int i=0; i<n; ++i)
            if(choose[i]) printf("%d", i);
        printf("\n");
        return ;
    }
    else{
        choose[cur] = 1;
        print_subset_2(cur+1);
        choose[cur] = 0;
        print_subset_2(cur+1);
    }
}

 

方法三二进制法

 

//----二进制法----//
for(int i=0; i< (1<<n); ++i)  print_subset_3(i); //0,1,....2^n-1  二进制表示2^n-1就是111...1(n-1个1)

void print_subset_3(int cur){
    for(int i=0; i<n; ++i)
        if(cur & (1<<i)) printf("%d", i);
    printf("\n");
}

 

 

 

总程序:

#include <iostream>
#include <algorithm>
using namespace std;
#define MaxSize 100
int n;
int subset[MaxSize];
int choose[MaxSize];

//----增量构造法----//
void print_subset_1(int cur){  //cur现在的长度
    for(int i=0; i<cur; ++i)  printf("%d ", subset[i]);
    if(cur != 0) printf("\n");
    int start = cur ? subset[cur-1]+1 : 0;
    for(int i=start; i<n; ++i){
        subset[cur] = i;
        print_subset_1(cur+1);
    }
}
//----位向量法----//
void print_subset_2(int cur){  //cur现在的长度
    if(cur == n){
        for(int i=0; i<n; ++i)
            if(choose[i]) printf("%d", i);
        printf("\n");
        return ;
    }
    else{
        choose[cur] = 1;
        print_subset_2(cur+1);
        choose[cur] = 0;
        print_subset_2(cur+1);
    }
}

//----二进制法----//
void print_subset_3(int cur){
    for(int i=0; i<n; ++i)
        if(cur & (1<<i)) printf("%d", i);
    printf("\n");
}

int main(){
    cin>>n;
    cout<<"Incremental construction:"<<endl;
    print_subset_1(0);
    cout<<"Vector construction:"<<endl;
    print_subset_2(0);
    cout<<"Binary construction:"<<endl;
    for(int i=0; i< (1<<n); ++i)  print_subset_3(i);
    return 0;
}

 

posted @ 2020-04-20 19:58  Abel_chen  阅读(158)  评论(0)    收藏  举报