算法——递归生成集合的所有组合
来源:互联网 发布:php有哪些优势和特点 编辑:程序博客网 时间:2024/04/28 18:52
题目描述
输入一个集合,需要生成该集合所能得出的所有组合。举例说明:若输入集合为{1,2} , 需要生成的组合有{1},{1, 2},{2} 。该题目与生成集合的全排列有很多相似之处,同样也是一个很经典的问题。
解决思路
在我前面的一篇文章:Gray Code实现按序产生集合的所有子集 http://blog.csdn.net/syzcch/article/details/7899691 中讲述了如何利用Gray Code生成集合的所有子集。这里我们利用递归的思想来实现该问题的解。
面对这样一个问题,我们需要仔细分析。题目要求生成一个集合的所有组合,也就是需要生成集合里的元素所能够组成的所有组合。于是一个很明显的思路就是要遍历该集合。一提到遍历集合,可以使用循环或者递归来实现。针对本问题,利用递归的思想是很方便的。
假设我们的集合为{1,2,3} ,我们从头扫描集合的元素,第一个元素为1。对于这个元素,我们可以把他放到组合集中,然后在剩下的集合里再去选择;也可以不把他放到组合集中,在剩下的集合里去选择元素放到组合集中。一般化的,假设我们的集合有n个元素,要求m个元素的组合。我们扫描每一个元素,针对该元素,我们可以将其放到组合集中,然后在剩下的n-1个元素中再选择m-1个元素;我们也可以不放该元素进集合,而直接从剩下的n-1个元素中选择m个元素。这已经是非常清晰的递归的思想了,具体代码如下。
代码
void combination(char *src,int num, vector<char>& result){ if(num==0) { vector<char>::iterator iter=result.begin(); for(;iter<result.end();iter++) { printf("%c",*iter); } printf("\n"); return; } if(*src=='\0') return; result.push_back(*src); combination(src+1,num-1,result); result.pop_back(); combination(src+1,num,result);}void all_sub_set(char *src){ assert(src); if(!src) return; int i=0; int len=strlen(src); vector<char> result; for(i=1;i<=len;i++) { combination(src,i,result); }}
小结
递归生成集合的所有组合,是考验一个程序员编程基本功的问题,有一些技巧性。本问题与Gray Code按序生成集合子集属于同一个问题的不同实现方法,都是很经典的解题方法。- 算法——递归生成集合的所有组合
- 用递归法来实现字符集合的所有组合
- 一些常用集合算法——之组合生成
- 组合的递归算法
- 组合的递归算法
- 递归算法生成n个元素的所有排列
- 经典算法——字符串的所有组合
- 算法系列—— 输出所有的笛卡尔积组合
- 组合的生成算法
- C#组合的递归算法
- 实现组合的递归算法
- 打印给定一字符串的所有字母组合——递归实现
- n选m 的所有组合 无递归的算法 php实现
- 数组生成的所有集合
- 从n个自然数中任取r个数的所有组合(递归算法)
- 从n个自然数中任取r个数的所有组合(递归算法)
- 算法系列 ——遍历所有控件的递归和非递归实现
- 算法:在一个集合中选取所有符合条件的元素组合
- VC 6.0在win7下无法加入ActiveX控件的解决方案
- 新手解疑:Tomcat版本问题
- LPTSTR、LPCSTR、LPCTSTR、LPSTR的来源及意义
- UIDatePicker 日期/时间选取器(滚轮)
- C++打印曲线
- 算法——递归生成集合的所有组合
- jsp form 表单或超链接传参数中文乱码问题小结
- 迪杰斯特拉算法求最短路径 C++代码实现
- .Net关于对象的销毁(IDisposable和using) - 非托管资源
- VC6.0中友元函数无法访问类私有成员的解决办法
- js硬绑定img的onload事件的思路
- java synchronized详解
- select 在jqueryMobile中的disabled刷新样式问题
- 文章2:TCP Keepalive 概述