子集生成
2015-02-14 16:23
106 查看
第一种方法:增量构造法,一次选出一个元素放到集合中,程序如下:
第三种方法:二进制法
#include<cstdio> #include<cstring> #include<cstdlib> 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; for(int i = s; i < n; i++) { A[cur] = i; print_subset(n,A,cur+1); } } int main() { int A[100]; int n; scanf("%d",&n); print_subset(n,A,0); return 0; }第二种方法:位向量法,构造一个位向量B[i],而不是直接构造子集A本身,其中B[i]=1当且仅当i在子集A中。
#include<cstdio> #include<cstring> #include<cstdlib> void print_subset(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(n,B,cur+1); B[cur] = 0; print_subset(n,B,cur+1); } int main() { int A[100],B[100]; int n; scanf("%d",&n); print_subset(n,B,0); return 0; }
第三种方法:二进制法
#include<cstdio> #include<cstring> #include<cstdlib> 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; scanf("%d",&n); for(int i = 0; i < (1<<n); i++) print_subset(n,i); return 0; }
相关文章推荐
- 生成集合[n]的所有k-子集MATLAB代码
- [Day 1] 7.3.1 子集生成-增量构造法
- 枚举 子集生成
- 子集生成模板、
- 子集生成算法 之 位向量法和增量构造法
- ACM_子集生成算法总结
- 子集生成
- UVA - 1151 Buy or Build(最小生成树+二进制枚举子集)
- (子集生成算法)
- 子集生成的各种实现
- uva-1151-Buy or Build-二进制枚举子集,并查集,最小生成树,kruskal
- UVA 1151 Buy or Build(最小生成树+枚举子集)
- 子集生成算法
- 生成一个集合的所有子集 Subset
- 生成子集
- 生成子集
- 入门经典 第七章 7.3.1 增量构造生成子集
- 暴力求解法--生成子集
- uva 11205 The Broken Pedometer(经典的子集生成题目,在此总结了三种子集生成的方法~)
- UVA 1151 - Buy or Build(最小生成树,二进制子集生成)