子集生成
2016-08-31 10:17
190 查看
//2016.8.31 #include <iostream> #include <cstdio> using namespace std; void print_subset(int n, int *a, int cur)//增量构造法 { for(int i = 0; i < cur; i++)cout<<a[i];//打印当前集合,即选出的元素序号 cout<<endl; int tmp = cur?a[cur-1]+1:0;//确定当前元素的最小可能值 for(int i = tmp; i < n; i++) { a[cur] = i; print_subset(n, a, cur+1);//递归构造子集 } } void print_subset2(int n, int *b, int cur)//位向量法 { if(cur==n){//打印 for(int i = 0; i < n; i++) if(b[i])cout<<i; cout<<endl; return ; } b[cur] = 1;//选择第cur个元素 print_subset2(n, b, cur+1); b[cur] = 0;//不选择第cur个元素 print_subset2(n, b, cur+1); } void print_subset3(int n)//二进制法,A&B,A|B,A^B分别对应集合A和B的交、并、对称差 { for(int s = 0; s < (1<<n); s++){ for(int i = 0; i < n; i++) if(s&(1<<i))cout<<i; cout<<endl; } } int main() { int a[4], b[4]; print_subset(4, a, 0); cout<<"--------------------------------------"<<endl; print_subset2(4, b, 0); cout<<"--------------------------------------"<<endl; print_subset3(4); return 0; }
相关文章推荐
- 子集生成算法
- [Day 1] 7.3.1 子集生成-增量构造法
- 生成一个整数集合的所有子集
- 子集生成算法 之 位向量法和增量构造法
- 子集生成 位向量发法
- ACM_子集生成算法总结
- 子集生成
- 7.3.2(子集生成1)
- 子集生成
- 读《算法竞赛入门经典》 7.3子集生成
- 子集生成的各种实现
- UVA 1151 Buy or Build(最小生成树+枚举子集)
- 子集生成模板、
- 实现生成子集
- 生成一个集合的所有子集 Subset
- UVA - 1151 Buy or Build(最小生成树+二进制枚举子集)
- (子集生成算法)
- uva-1151-Buy or Build-二进制枚举子集,并查集,最小生成树,kruskal
- 经典重访: 如何按序生成集合的所有子集
- 子集生成算法