1. 程式人生 > >遞迴的應用-組合數求解

遞迴的應用-組合數求解

從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)開始,當然要注意初始化,和終止條件。

直接從組合公式也能得到這個公式。

現在看程式碼:

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

問題變形:

如果N個數中有重複呢?例如:N個字元,選出k個字元組合起來,共有多少種組合?再者,共有多少種排列?(組成多少單詞)