遞迴的應用-組合數求解
阿新 • • 發佈:2019-02-14
從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)開始,當然要注意初始化,和終止條件。
直接從組合公式也能得到這個公式。
現在看程式碼:
- #include <iostream>
- usingnamespace std;
- int Cal(int N , int k)
- {
- if(0 == k || 0 == N)
- {
- return 1;
- }
- if(N < k)
- {
- return 0;
- }
- if(N == k)
- {
- return 1;
- }
-
return Cal(N-1,k) + Cal(N-1,k-1);
- }
- // test
- int main()
- {
- int N = 3;
- int k = 2;
- cout<<Cal(N,k)<<endl;
- }
問題變形:
如果N個數中有重複呢?例如:N個字元,選出k個字元組合起來,共有多少種組合?再者,共有多少種排列?(組成多少單詞)