子集生成模板、
2016-02-05 09:51
169 查看
//子集生成算法:给定一个集合,枚举所有可能的子集。 //为了简单起见,讨论的方法中没有重复元素 //增量构造法 #include<cstdio> #include<cmath> 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[10],n; //这种方法只适合求从0~n-1的连续整数的子集 scanf("%d",&n); for(int i=0;i<n;++i) scanf("%d",&A[i]); print_subset(n,A,0); }
//位向量法 //构造一个位向量B[i],而不是直接构造子集本身,其中B[i]=1,当且仅当i在自己A中. 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; //选第cur个元素 print_subset(n,B,cur+1); B[cur]=0; //不选第cur个元素 print_subset(n,B,cur+1); }
//二进制表示子集法、 //下面程序输出子集S对应的各个元素 void print_subset(int n,int s) { for(int i=0;i<n;++i) if(s&(1<<i)) printf("%d",i); printf("\n"); //枚举子集和枚举整数一样 for(int i=0;i<(1<<n);++i) //枚举各子集对应的编码 print_subset(n,i); } //从代码量看,枚举子集的最简单方法是二进制法、 //当用二进制表示子集时,位运算中的按位与、或、异或对应集合的交、并和对称差
要看回溯法了、先巩固一下递归
相关文章推荐
- python selenium --处理下拉框
- 使用pyinstaller制作包含Oracle数据库的可执行程序
- 嵌入式 jetty 启动应用
- 怎样使用 GitHub?
- UnityEngine.UI.dll' is in timestamps but is not known in guidmapper...
- 网络请求发送不过去,找错用抓包:wireshark捕获指定ip地址数据包
- Math.trunc
- 2003 cant connect to MySQL server on 'XXX.XXX.XXX.XXX'
- Ftxxxx系列------如何让屏幕依然可以滑动当手指按在virtual key旁边 的黑色部分的时候
- (转)个人职业规划中如何使自己的职业生涯升华
- VC获取系统时间、程序运行时间(精确到秒,毫秒)的五种方法
- codeigniter IE浏览器下无法登录的解决的方法
- android 判断应用程序是否已安装(附带常用软件包名)
- ConcurrentHashMap源码分析--Java8
- Symfony2实现在doctrine中内置数据的方法
- 表单上传
- 提前还款。
- CString、CTime和COleDateTime转换
- C++程序设计(II) 兼谈对象模型
- Floyed算法 最短路径