码迷,mamicode.com
首页 > 其他好文 > 详细

组合问题的递归实现

时间:2015-08-16 00:24:37      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

算法说明:从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  }

 

组合问题的递归实现

标签:

原文地址:http://www.cnblogs.com/shutter/p/4733314.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!