• 【转】递归生成集合的所有组合


    本文原文链接:http://blog.csdn.net/syzcch/article/details/8208784

    题目描述

    输入一个集合,需要生成该集合所能得出的所有组合。举例说明:若输入集合为{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个元素。这已经是非常清晰的递归的思想了,具体代码如下。

    代码

     1 void combination(char *src,int num, vector<char>& result)
     2 {
     3     if(num==0)
     4     {
     5         vector<char>::iterator iter=result.begin();
     6         for(;iter<result.end();iter++)
     7         {
     8             printf("%c",*iter);
     9         }
    10         printf("
    ");
    11         return;
    12     }
    13     if(*src=='') return;
    14     result.push_back(*src);
    15     combination(src+1,num-1,result);
    16     result.pop_back();
    17     combination(src+1,num,result);
    18 }
    19 
    20 void all_sub_set(char *src)
    21 {
    22     assert(src);
    23     if(!src) return;
    24     int i=0;
    25     int len=strlen(src);
    26     vector<char> result;
    27 
    28     for(i=1;i<=len;i++)
    29     {
    30         combination(src,i,result);
    31     }
    32 }
    View Code
  • 相关阅读:
    Windows Phone7官方更新 增加复制粘贴
    使Apache(Linux)支持Silverlight
    WPF触摸屏项目案例(放置在奔驰公司触摸屏展厅)
    项目开发项目管理(转)
    诺基亚WP7手机界面曝光
    Windows 8十大传言:令苹果坐立不安
    如何为 iPad 打造速度超快的 HTML5 软件
    Silverlight5.0正式发布附下载地址
    我们的案例请访问我们团队官网http://Silverlighter.net
    【转】NTFS3G的安装和配置
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/3572185.html
Copyright © 2020-2023  润新知