组合问题的递归实现

算法说明:从n个数中选m个数,可以分解为以下两步

(1)首先从n个数中选取编号最大的数,然后在剩下的n-1个数中选取m-1个数,直到从n-(m-1)个数中选取1个数为止。

(2)从n个数中选取编号次小的一个数,继续执行第(1)步,直到当前可选编号最大的数为m。

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 void Combine(int a[], int n ,int m, int b[], const int M);
 6
 7 int main()
 8  {
 9       //从N个数中选M个数,N=6,M=3
10       const int N = 6;
11       const int M = 3;
12
13      int a[N];
14       int b[M]; //用来存储当前组合中元素(这里存储是元素下标)
15       for (int i = 0; i < N; i++)
16           a[i] = i+1;
17
18      Combine(a, N, M, b, M);
19
20      return 0;
21  }
22
23 void Combine(int a[], int n ,int m, int b[], const int M)
24  {
25       for (int i = n; i >= m; i--)
26       {
27           b[m-1] = i -1; //选取候选集a[]中最大的一个数,记录其下标
28           if (m > 1)
29               Combine(a, i-1, m-1, b, M); //从n-1中再选m-1个元素
30           else //1==m,没有元素可选,一个组合已经完成,输出
31       {
32       for (int j = M-1; j >= 0; j--)
33            cout<<a[b[j]];
34       cout<<endl;
35        }
36      }
37  }
时间: 2024-10-12 22:59:39

组合问题的递归实现的相关文章

字符串数组元素排列与组合的Java递归实现

排列与组合的Java递归实现 (参考) 我们在笔试面试过程中经常会遇到关于排列与组合的问题,其实这些可以通过递归简单的实现,看下面两个例子: (1)关于字符串排列的问题 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 可以这样想:固定第一个字符a,求后面两个字符bc的排列.当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面

组合问题非递归

组合问题非递归形式: 例如有5个数,选其中3个数 ,将其模拟成 1 1 1 0 0 1 1 0 1 0 1 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 0 .......... 需要将每次交换后的1结合在一起. 1 #include<cstdio> 2 int b[25]={ 3 0 4 } ; 5 void Print(int len,int r) 6 { 7 int temp=0; 8 for(int i=0;i<len;i++) 9 { 10 if(b[

排列组合问题(递归实现)

在做递归问题时,要保证对递归跳跃的信任,继而对相应的问题寻找其递归实现 (1)组合:先从原始数组中选择一个,再从剩下的集合中选择m-1个:而后,再从剩下的集合中挑选m个元素. /*组合代码(eg:5选2)*/ int a[5]={1,2,3,4,5};//原始数组 int b[2];//挑选的结果 const int need=2;//需要选择的个数 void combine(int start,int end,int x) { if(x==need) { //(1)打印组合的内容 /* for

组合问题

对ABCD进行组合,使用递归思想. 递归逻辑:使用一个和字符串数组相同长度的布尔数组来确定是否选择某一位字符.每次递归有两次递归调用,一个是当前位为true,也就是选择当前这一位的字符,另一个当前位为false,也就是不选择当前这个字符,将选择压力推到下一次递归. 递归函数为public static void f(char[] a,int num,boolean[] x,int start): start是每次递归开始的位置. x是一个用来标记被选择的位的布尔数组 代码: 1 public s

多维容器按列组合元素

// alg2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" //昨天碰到一个文件,有这么一个std::vector<std::vector<std::string>> //现在需要将每一列的数据进行组合 //按照普通写法,每个vector的长度是知道的直接 //for(int lvl1;.....) // for(int lvl2;...) // for(int lvl3,...) //但问题是第一层的长度是变长,所以

[LeetCode]Subsets II生成组合序列

class Solution {//生成所有[不重复]的组合.生成组合只要采用递归,由序列从前往后遍历即可.至于去重,根据分析对应的递归树可知,同一个父节点出来的两个分支不能一样(即不能与前一个元素一样,且前一个元素要与之在同层). public: int *b,n; vector<int>a; vector<vector<int> >ans; void dfs(int id,int len){ if(len>0){ vector<int>v(b,b+

设计模式之第22章-组合模式(Java实现)

设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎么什么都不说就直接上来了.”“本式行不更名坐不改姓,就是组合模式来着,此次受作者之邀来讲讲我的前世今生来着.”“哦,你就是组合模式啊,久仰久仰.”“失敬失敬.”恩,首先我先说下定义:Compose objects into tree structure to represent part-whole

SQL With(递归 CTE 查询)

本文来自:http://www.cnblogs.com/smailxiaobai/archive/2012/01/16/2323291.html 指定临时命名的结果集,这些结果集称为公用表表达式 (CTE).该表达式源自简单查询,并且在单条 SELECT.INSERT.UPDATE 或 DELETE 语句的执行范围内定义.该子句也可用在 CREATE VIEW 语句中,作为该语句的 SELECT 定义语句的一部分.公用表表达式可以包括对自身的引用.这种表达式称为递归公用表表达式.  Transa

55. 2种方法求字符串的组合[string combination]

[本文链接] http://www.cnblogs.com/hellogiser/p/string-combination.html [题目] 题目:输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. [分析] 在之前的博文28.字符串的排列[StringPermutation]中讨论了如何用递归的思路求字符串的排列.同样,本题也可以用递归的思路来求字符串的组合. [递归法求组合] 可以考虑求长度为n的字符串中m个字符的组合,