子集生成
来源:互联网 发布:网络电影演员火不了 编辑:程序博客网 时间:2024/06/04 23:21
一、增量构造法产生没有重复元素集合的所有子集
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;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; //s用来确定当前开始的最小位置 for(int i = s; i < n; i++) { A[cur] = i; print_subset(n, A, cur+1); }}int main(){ int A[100]; int n; cin >> n; for(int i = 0; i < n; i++) cin >> A[i]; sort(A, A+n); print_subset(n+1, A, 1); return 0;}
二、位向量法
#include<iostream>#include<cstdio>using namespace std;void print_subset(int n, int* B, int cur){ if(cur == n) { for(int i = 1; i <= cur; i++) if(B[i]) printf("%d ", i); printf("\n"); return ; } B[cur] = 1; print_subset(n, B, cur+1); B[cur] = 0; print_subset(n, B, cur+1);}int main(){ int n; cin >> n; int A[10]; print_subset(n, A, 0); return 0;}
三、二进制法
#include<iostream>#include<cstdio>using namespace std;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(){ int n; cin >> n; for(int i = 1; i < (1<<n); i++) print_subset(n, i); return 0;}
关于位运算的补充:
/*关于位运算的学习:A&B: 求的是集合A和集合B的交集A|B: 求的是集合A和集合B的并集A^B: 求的是集合A和集合B的对称差((A|B)- (A&B))空集为0;全集 : ALL_BITS = (1<<n) - 1;补集 : ALL_BITS ^ A;*/