子集生成

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

#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;
*/


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值