首页 > 其他 > 详细

子集生成

时间:2020-04-20 20:31:53      阅读:51      评论:0      收藏:0      [点我收藏+]

输入一个数,生成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;
}

 

子集生成

原文:https://www.cnblogs.com/futu-/p/12740039.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!