组合数公式:Combin(m,n)=m!/[(m-n)!*n!]
因为在程序计算的时候会存在一个问题,m!的阶乘非常大的,我们就不能直接将分子和分母计算出来然后进行相除,这就需要用到降解。
Combin(m,n) = Combin(m-1,n-1) + Combin(m-1,n)
这个等式,表明任意m选n组合的计算,可以分解为:【m-1 选 n-1的组合数】 + 【m-1 选 n 的组合数】 之和。
这个变换,很容易理解,当我们选择去选择一个元素的时候,有两个选择
1.选择当前元素,剩余的需要选择的个数减1(因为选了一个),也就是n变成n-1,可供选择的元素减1(因为选了一个),也就是m变成m-1。
2.不选择当前元素,剩余的需要选择的个数不变 (因为当前没有选择,还是需要选择那么多个),可被选择的元素减1(因为放弃了当前元素的选择,以后都不再选了,因为组合是不管先后顺序的,如果当前不去除掉当前元素,会导致重复选择)。
因此,上面这二个部分相加,就是全部m个元素中任选n个元素的组合了。
#include <stdio.h>
#define MAX 1005
#define ll long long
ll map[MAX][MAX];
int main()
{
int m,n;
for(int i = 1 ; i <= 100 ; i++ ){
// 初始化特殊位置
map[i][1] = i,map[i][i] = 1;
}
for(int i = 2 ; i <= 100 ; i++){
for( int j = 2 ; j < i ; j++){
map[i][j] = map[i-1][j]+map[i-1][j-1];
}
}
scanf("%d%d",&m,&n);
if(m < n){
return;
}
printf("%d\n",map[m][n]);
return 0;
}