子集生成

来源:互联网 发布:网络电影演员火不了 编辑:程序博客网 时间:2024/06/04 23:21

一、增量构造法产生没有重复元素集合的所有子集

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;void print_subset(int n, int * A, int cur){    for(int i = 0; i < cur; i++)        printf("%d ", A[i]);    printf("\n");    int s = cur ? A[cur-1] + 1: 0; //s用来确定当前开始的最小位置    for(int i = s; i < n; i++)    {        A[cur] = i;        print_subset(n, A, cur+1);    }}int main(){    int A[100];    int n;    cin >> n;    for(int i = 0; i < n; i++)        cin >> A[i];    sort(A, A+n);    print_subset(n+1, A, 1);    return 0;}

二、位向量法

#include<iostream>#include<cstdio>using namespace std;void print_subset(int n, int* B, int cur){    if(cur == n)    {        for(int i = 1; i <= cur; i++)            if(B[i]) printf("%d ", i);        printf("\n");        return ;    }    B[cur] = 1;    print_subset(n, B, cur+1);    B[cur] = 0;    print_subset(n, B, cur+1);}int main(){    int n;    cin >> n;    int A[10];    print_subset(n, A, 0);    return 0;}

三、二进制法

#include<iostream>#include<cstdio>using namespace std;void print_subset(int n, int s){    for(int i = 0; i < n; i++)        if(s&(1 << i)) printf("%d ", i);    printf("\n");}int main(){    int n;    cin >> n;    for(int i = 1; i < (1<<n); i++)        print_subset(n, i);    return 0;}

关于位运算的补充:

/*关于位运算的学习:A&B: 求的是集合A和集合B的交集A|B: 求的是集合A和集合B的并集A^B: 求的是集合A和集合B的对称差((A|B)- (A&B))空集为0;全集 : ALL_BITS = (1<<n) - 1;补集 : ALL_BITS ^ A;*/


原创粉丝点击