暴力求解法--生成子集

来源:互联网 发布:2003版办公软件 编辑:程序博客网 时间:2024/06/04 20:04


#include <iostream>

using namespacestd;

//推荐二进制法,所以放在最前面

void print_subset(int n,int s)

{

    for (int i = 0; i < n; i ++) {

        if (s & (1 << i))  printf("%d",i);

    } printf("\n");


}

void print_subset_bit(int n)

{

    for (int i = 0; i < (1 << n); i ++) {

        print_subset(n, i);

    }

}

//增量构造法

void print_subset_0n(int n,int *a,int cur)//生成0 - n-1的子集

{

    for (int i =0; i < cur; i ++) printf("%d",a[i]);

    printf("\n");

    int s = cur ? a[cur -1] +1:0;//cur0,就从0开始找子集,否则从前一个数+ 1开始往下找

    for (int i = s; i < n; i ++) {

        a[cur] = i;

        print_subset_0n(n, a, cur +1);

    }

        

}

//位向量法

void print_subset_01(int n,int *b,int cur)

{

    if (cur == n) {

        for (int i =0; i < cur; i ++) {

            if (b[i]) {

                printf("%d",i);

            }

        }printf("\n");

        return ;

    }

    b[cur] = 1;

    print_subset_01(n, b, cur +1);

    b[cur] = 0;

    print_subset_01(n, b, cur +1);

}


int main()

{

    int a[10];

    int b[10];

    print_subset_0n(4, a,0);

    print_subset_01(4, b,0);

    print_subset_bit(4);

    return0;

}


原创粉丝点击