子集生成

1. 增量构造法。 假设给出的数组是有序且无重复的。

void print_subset(int n, int *a, int cur) {
    for ( int i = 0; i < cur; i++ ) printf("%d ", a[i]);
        printf("\n");
    int s = cur ? a[cur - 1] + 1 : 0;  // 这句重要。用到了定序技巧, 规定集合a中元素编号从小到大排列。
    for ( int i = s; i < n; i++ ) {
        a[cur] = i;
        print_subset(n, a, cur+1);
    }

}

2. 定位向量法。

void print_subset(int n, int *a, int cur) {
    if ( n == cur ) {
        for ( int i = 0; i < n; i++ ) {
            if ( a[i]==1 ) printf("%d ", N[i]);
        }
        printf("\n");
        return;
    }
    a[cur] = 0;
    print_subset(n, a, cur+1);
    a[cur] = 1;
    print_subset(n, a, cur+1);
}

 

3. 二进制法 (壮哉我大二进制!!)

void print_subset(int n , int s) {
    for ( int i = 0; i < n; i++ ) {
        if ( s&(1<<i)) printf("%d ", i);
    }
    printf("\n");
}

int main() {
    for ( int i = 0; i < (1<<L); i++ ) 
        print_subset(L, i);

    return 0;
}

 

posted @ 2012-12-06 23:30  tsubasa_wp  阅读(212)  评论(0编辑  收藏  举报