排列组合

一、基本公式

(特殊的,0!=1)(以下n>=m)

排列A_{n}^{m}=\frac{n!}{(n-m)!}

表示从n个数中取出m个数来排列的方案总数,忽略顺序。例如:m=2时,(1,2)是一种,(2,1)是另一种。

 

组合:C_{n}^{m}=\frac{n!}{m!(n-m)!}=C_{n-1}^{m-1}*n/m

表示从n个数中取出m个数来组合的方案总数,限制顺序。可以理解为从n个数中取出m个数有多少种取法。例如:m=2时,(1,2)和(2,1)是同一种。m=3时,(1,2,3)和(1,3,2)以及(2,1,3)等是同一种。

二、经典例题

1、将n个相同的球放进m个不同的盒子里。球要放完,盒子不能为空,问有多少种放法。

解:题目等价于有n个球,要在两个球之间插板子(两个球之间最多能插一个),将球分为m个部分。n个球,有n-1个空隙可以插;m个部分,只用m-1个板子。

 

所以又可以等价于有n-1个板子,只需要取m-1个板子,问有多少种取法。因为反正都是把球分为m个部分,所以不同的板子得到的效果是一样的,所以可以理解为是同一种取法。这就是组合。答案:C_{n-1}^{m-1}

 

2、将n个相同的球放进m个不同的盒子里。球要放完,盒子可以为空,问有多少种放法。

解:假设盒子不可以为空,放在此题种就等价于你已经放了m个球,还有n个球。所以此题等价于有n+m个球,放在m个盒子里,球要放完,盒子不能为空,这就是第一题了。答案:C_{n+m-1}^{m-1}

 

3.将n个不同的球放在m个相同的盒子里。要求每个盒子里球的数量一样,球要放完(数据保证m是n的因子),问有多少种方法。

解:设n/m=x,即每个盒子里要放x个球。放球时,第一步:在n个球中取出x个球放在一个空盒里,第二步又在剩下的n-x个球中取出x个球放在一个空盒里......直至放完。所以第一步的方法总数是:C_{n}^{x},到第二步的方法总数是:C_{n}^{x}*C_{n-x}^{x},一共m步,以此类推。但是有这种情况:已经以某一种方案按要求将所有球放进m个盒子里了,现在却只是将A盒里的球放进B盒里,将B盒里原来的球放进A盒里。因为盒子是一样的,所以这是同一种方法。但计算时却以为是另一种方法。而这个等价于:已经以某一种方案按要求将所有球放进m个盒子里了,现在却只是将盒子调换位置,却认为是不同的方法。调换位置的方法有A_{m}^{m}个。所以最后还要减去A_{m}^{m}。答案:C_{n}^{x}*C_{n-x}^{x}*......*C_{x}^{x}-A_{m}^{m}

三、求组合数

1、递归递推(详见上面的公式)

2、杨辉三角

组合数是和杨辉三角上的数一一对应的,只用处理细节。

附代码:

for(i = 0;i <= 1000;i++){   //根据题目要求确定大小
    c[i][0] = c[i][i] = 1;
    for(j = 1;j < i;j++)
        c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;  //此处可根据题目要求取模
}

3、在n确定的情况下快速求C(n,m)

这个没什么技术含量,用小学数学推导。

即已知C(n,m),求C(n,m + 1)

C_{n}^{m+1}=C_{n}^{m}*(n-m)/(m+1)

ans = n;  // C(n,1) = n;
for(i = 2;i <= m;i++)
    ans = ans * (n - i + 1) / i;   // C(n,i) = ans;

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值