枚举 子集生成

来源:互联网 发布:linux下codeblocks 编辑:程序博客网 时间:2024/05/21 17:19

增量构造法

 

带给定数组P

void print_subset(int n, int *A,int *P, int cur, int pos){int i;for (i = 0; i < cur; i++){printf("%d ", A[i]);}printf("\n");if (pos < n - 1){for (i = pos; i < n; i++){if (!cur || A[cur - 1] != P[i]){A[cur] = P[i];print_subset(n, A, P, cur + 1, i);}}}}


自然序列

void print_subset1(int n, int *A, int cur){int i;for (i = 0; i < cur; i++)  //打印当前集合printf("%d ", A[i]);printf("\n");cnt++;int s = cur ? A[cur - 1] + 1 : 0;for (i = s; i < n; i++){A[cur] = i;print_subset1(n, A, cur + 1);}}

 

二进制位数表示非递归枚举方法

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