子集生成:增量构造法 位向量法 二进制法

子集生成算法:给定一个集合(集合中无重复元素),枚举所有可能的子集。下面以输入集合1,3 ,5为例。

刘汝佳算法竞赛入门经典P188。


1.增量构造法。即一次选出一个元素放在集合中,每次放入新元素后输出。

原理图:

子集生成:增量构造法 位向量法 二进制法_第1张图片

#include
#include
#include
#include
using namespace std;
const int maxn=100010;
int n;
int arr[maxn],A[maxn];

void print_subset(int cur){
    if(cur){
        for(int i=0;i>n;
    for(int i=0;i>arr[i];
    sort(arr,arr+n);
    print_subset(0);
    return 0;
}


输出结果:

子集生成:增量构造法 位向量法 二进制法_第2张图片


2.位向量法。构造一个位向量B[i],而不是直接构造子集A本身。当B[i]=1时,表示选这个元素,等于0时表示不选。利用递归实现。

原理图:

子集生成:增量构造法 位向量法 二进制法_第3张图片

#include
#include
#include
#include
using namespace std;
const int maxn=100010;
int n;
int arr[maxn],B[maxn];

void print_subset(int cur){
    if(cur==n){
        for(int i=0;i>n;
    for(int i=0;i>arr[i];
    print_subset(0);
    return 0;
}


输出结果:

子集生成:增量构造法 位向量法 二进制法_第4张图片


3.二进制法。

#include
#include
#include
#include
using namespace std;
const int maxn=100010;
int n;
int arr[maxn];

void print_subset(int s){
    for(int i=0;i>n;
    for(int i=0;i>arr[i];
    for(int i=0;i<(1<

输出结果:

子集生成:增量构造法 位向量法 二进制法_第5张图片

你可能感兴趣的:(暴力)