子集生成的各种实现
2013-07-21 18:47
218 查看
/*子集生成的各种实现*/ #include <iostream> #include<algorithm> #include<queue> #include<stack> #include<cmath> #include<string.h> #include<stdio.h> #include<stdlib.h> using namespace std; #define maxn 26000 int A[maxn]; int B[maxn]; int n,sum; void print_subset(int n,int *A, int cur)//用增量法实现子集生成 { int i; for(i=0; i < cur ; i++) { printf("%d ",A[i]);//打印当前集合 if(i==0) sum++;//没有把空集列出来,共2^n-1个 } printf("\n"); int s = cur ?A[cur-1]+1 : 0;//确定当前元素最小可能值 for(i=s; i<n; i++) { A[cur]=i; printf("cur = %d i = %d\n",cur,i); printf("调用print_subset( %d )\n",cur+1); print_subset(n,A,cur+1);//递归构造子集 } } void print_subset1(int n,int *B,int cur)//用位向量法实现子集生成 { printf("cur = %d n = %d\n",cur,n); if(cur==n) { for(int i=0; i<cur; i++) if(B[i]) printf("%d ",i);//打印当前集合 sum++;//共有2^n个 printf("\n"); return ; } B[cur]=1; print_subset1(n,B,cur+1);//选第cur个元素 B[cur]=0; print_subset1(n,B,cur+1);//不选第cur个元素 } //二进制法 //当用二进制表示子集时,位运算中的按位与、或、异或对应集合的交、并、和对称差 void print_subset2(int n,int s)//打印{0,1,2,3,...,n-1}的子集S { for(int i=0; i<n; i++) if(s&(1<<i)) printf("%d ",i); printf("\ns = %d",s); printf("\n"); } int main() { while(~scanf("%d",&n)) { sum=0; //print_subset(n,A,0); //print_subset1(n,B,0); //printf("sum = %d\n",sum); for(int i=0; i<(1<<n); i++)//枚举各子集所对应的编码0,1,2,3,...,2^n-1 print_subset2(n,i); printf("sum = %d\n",1<<n); } return 0; }
相关文章推荐
- 【代码实现】PHP生成各种随机验证码
- proxy 利用get拦截,实现一个生成各种DOM节点的通用函数dom。
- 子集生成(二进制法)-java实现
- Go实战--golang中各种排序算法实现以及生成随机数
- PHP实现批量生成App各种尺寸Logo
- 实现生成子集
- 万能js实现翻页,动态生成内容自动翻页,兼容各种浏览器(已测试)----神器版!
- 【代码实现】PHP生成各种随机验证码
- 通过java反射实现对javabean生成各种sql语句
- 各种最小/最大生成树的实现
- 万能js实现翻页,动态生成内容自动翻页,兼容各种浏览器(已测试)----神器版!
- 自己是实现的一个生成子集程序
- 通过java反射实现对javabean生成各种sql语句
- 访问需要HTTP Basic Authentication认证的资源的各种语言的实现
- java实现最小生成树的prim算法和kruskal算法
- 如何正确实现PHP生成唯一标识符
- 各种排序算法(内部排序)及其实现
- python生成词云的实现方法(推荐)
- 使用Myeclipse10.0自动生成搭建SSH框架(数据库表自动反向转换成Hibernate实体)实现用户登陆
- java代码实现二维码图片的生成和解析