从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>
- using namespace 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个字符组合起来,共有多少种组合?再者,共有多少种排列?(组成多少单词)