http://acm.nyist.net/JudgeOnline/problem.php?pid=459

这是我改编的一道组合题,之我感觉良好,,嘻嘻,,

这里主要用到两个组合数的公式,,,,

#include<iostream>
#include<cstdio>
#define N 32
using namespace std;
typedef long long L;
L a[N][N];
int n,m;
int main()
{   for(int i=1;i<N;++i)
   a[i][0]=1,a[i][1]=i;
   for(int i=2;i<N;++i)
    for(int j=2;j<N;++j)
      a[i][j]=a[i-1][j]+a[i-1][j-1];//这是一个公式
      while(~scanf("%d%d",&n,&m)&&n&&m)
      {printf("%lld\n",a[n+m-1][m]);这是另一个,,,
      }return 0;
}

可重复组合数证明  

  从n个元素中有重复地取r个,不计其顺序,则不同的取法有C(n+r-1,r)种
很多教材都仅仅给出了公式,但是没有给出这个公式的证明,这里就给出一种证明,由于本人的语言表述能力欠佳,因此在阐述时显得十分罗嗦,希望大家能提出意见.
事实上,若将n个元素看做n个盒子,r看作r个同质的球,则相当于:
把r个同样的球放入n个顺次排列的盒子,求不计放球顺序的放法种数
把0看作是盒子,1看做是球;
由于球必须放在盒子中,规定某个0位之前,到上一个0位为止的1的个数,表示该盒子中装的球数:
则有重复排列数要求,
在n个0中放入r个1
这样,就相当于(n-1)个0和r个1的排列数,即(n+r-1)!/(n-1)!*r!=C(n+r-1,r)
比如:
1110100011111110 (1110 | 10 | 0 | 0 | 11111110) 是n=5, r=11 的一种具体情形
表示第一个盒子装3个球, 因为第一个0前有3个1
第二个盒子装1个球, 因为第二个0到第一个0间有1个1
第三个盒子装0个球, 因为第三个0到第二个0间有0个1
第四个盒子装0个球, 因为第四个0到第三个0间有0个1
第五个盒子装7个球, 因为第屋个0到第五个0间有7个1
转发至微博


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值