子集生成

增量构造法:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 100005;
int a[maxn];

void print_subset(int n,int *A,int cur){
    for(int i = 0;i < cur;i++)
        cout<>n;
    print_subset(n,a,0);
    return 0;
}

位向量法:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 100005;
int a[maxn];

void print_subset(int n,int *B,int cur){
    if(cur == n){
        for(int i = 0;i < cur;i++)
            if(B[i]) cout<>n;
    print_subset(n,a,0);
    return 0;
}

二进制法:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 100005;
int a[maxn];

void print_subset(int n,int s){
    for(int i = 0;i < n;i++)
        if(s & (1<>n;
   
    for(int i = 0;i < (1<

二进制法是最常用的方法。

1<

s代表第i个子集。(0 <= i < (2^n))

s&(1<

例如:A 10110

(从右往左)

0 --------序号1

1 --------序号2

1 --------序号3

0 --------序号4

1 --------序号5

你可能感兴趣的:(枚举)