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