子集生成

#include <iostream>

using namespace std;

// 增量构造法
void print_set(int *A, int n , int cur) {
    // 打印当前集合
    for(int i = 0; i < cur; i++) {
        cout << A[i] << " ";
    }
    cout << endl;

    // 确定当前元素的最小可能值
    int s = cur ? A[cur - 1] + 1 : 0;
    for(int i = s; i < n; i++) {
        A[cur] = i;
        print_set(A, n, cur + 1);
    }
}

// 位向量法
void print_set2(int *B, int n, int cur) {
    if(cur == n) {
        for(int i = 0; i < n; i++) {
            // 打印集合
            if(B[i]) {
                cout << i << " ";
            }
        }
        cout << endl;
        return ;
    }
    // 选择第cur个元素
    B[cur] = 1;
    print_set2(B, n, cur + 1);
    // 不选第cur个元素
    B[cur] = 0;
    print_set2(B, n, cur + 1);
}

// 二进制法
// 打印{0,1,..., n-1}的子集s
// 集合s 101
// 对应于{2, 0}
void print_subset(int n, int s) {
    for(int i = 0; i < n; i++) {
        // 集合s与(1右移i)位做位运算
        // 这样能使集合s中为1的位输出
        if(s & (1 << i)) {
            cout << i << " ";
        }
    }
    cout << endl;
}

void print_set3(int n) {
    // 枚举各子集所对应的编码0,1,...,2^n-1
    for(int i = 0; i < (1 << n); i++) {
        print_subset(n, i);
    }
}

int main() {
    int A[100];
// print_set(A, 3, 0);
// print_set2(A, 3, 0);
    print_set3(3);
}

你可能感兴趣的:(ACM,枚举集合,子集生成)