子集生成

来源:互联网 发布:日本人怕中国吗 知乎 编辑:程序博客网 时间:2024/05/03 07:25
#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);}
0 0
原创粉丝点击