组合数的降解计算

组合数公式: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值