递归的应用-组合数求解

来源:互联网 发布:mymps seo伪静态 编辑:程序博客网 时间:2024/05/16 19:42

从N个数中选择k个,共有多少组合?简单说就是求解C(N,k)。

实际问题,有N个教授,要选择k个组成委员会,共有多少种组合方式?


递归法:

将这N个人按照编号从小到大排好, 1,2,3...,k,...N

现在考虑从前M个人中选择k个,那么有两种情况:
1. 第M个人选进去,那么就是从剩下的M-1个人中选择k-1个,再加上第M个组成;
2. 第M个人不选进去,那么就是直接从M-1个人中选择k个。

组合数就是这两种情况的加和。
就构成了
C(M,k) = C(M-1,k-1) + C(M-1,k)
计算的之后可以直接从C(N,k)开始,当然要注意初始化,和终止条件。

直接从组合公式也能得到这个公式。

现在看代码:

[cpp] view plaincopy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int Cal(int N , int k)  
  5. {     
  6.     if(0 == k || 0 == N)  
  7.     {  
  8.         return 1;  
  9.     }  
  10.       
  11.     if(N < k)  
  12.     {  
  13.         return 0;  
  14.     }  
  15.       
  16.     if(N == k)  
  17.     {  
  18.         return 1;  
  19.     }  
  20.       
  21.     return Cal(N-1,k) + Cal(N-1,k-1);  
  22. }  
  23.   
  24. //  test  
  25. int main()  
  26. {  
  27.     int N = 3;  
  28.     int k = 2;  
  29.     cout<<Cal(N,k)<<endl;  
  30. }  

问题变形:

如果N个数中有重复呢?例如:N个字符,选出k个字符组合起来,共有多少种组合?再者,共有多少种排列?(组成多少单词)

0 0