zoukankan      html  css  js  c++  java
  • 小球和盒子的问题

    复习初赛的时候,这个问题一直困扰着我......

    n个小球,装进m个盒子里。

    三个条件:小球是否相同,盒子是否相同,是否允许有空盒子。

    这就组合出了共八个问题。

    1.小球相同,盒子相同,不允许有空盒子。

    这个问题等效成把一个数n拆成m个数,且先拆出的数不小于后拆出的数(避免重复情况)。

    设f(n,m)为n拆成m份的方案数。

    如果这么拆:x1+x2+x3+...+xm=n (xi>=1)。

    当x1=1时,后面的拆法表示成f(n-1,m-1)。

    当x1>=2时,式子可以变成(x1-1)+(x2-1)+...+(xm-1)=n-m。

    所以后面的拆法表示成f(n-m,m)。

    所以f(n,m)=f(n-1,m-1)+f(n-m,m)

    2.小球相同,盒子相同,允许有空盒子。

    相当于把问题1的xi>=1改成xi>=0。

    所以设x'=x+1,把式子变成x'1+x'2+...+x'm=n+m,转化为了问题1。

    答案即为f(n+m,m)

    3.小球不同,盒子相同,不允许有空盒子。

    设球的编号为1,2......n。

    设n个不同球,m个相同盒的放法为g(n,m)。

    如果第一个球的盒子里只有球1,之后的操作的方案数为g(n-1,m-1)。

    如果第一个球的盒子里不只有球1,可以先把1拿出来,剩下的随便放,方案数是g(n-1,m)。

    再把1放回去,m个盒子是相同的,所以有m种放法。

    加一起就是:g(n,m)=g(n-1,m-1)+m*g(n-1,m)

    4.小球不同,盒子相同,允许有空盒子。

    我们可以沿用问题3的思路。

    假设把所有球都放到一个盒子,两个盒子,三个盒子......m个盒子。

    这样就转换为了问题3。

    答案即为:g(n,1)+g(n,2)+g(n,3)+...+g(n,m)

    5.小球不同,盒子不同,不允许有空盒子。

    对问题3中的盒子进行不同排列即可。

    答案就是:m!*g(n,m)

    6.小球不同,盒子不同,允许有空盒子。

    显然随便放啊。

    方案数就是mn

    7.小球相同,盒子不同,不允许有空盒子。

    把长为n的一串小球分成m段。

    挡板法:在n-1个空里插入m-1个挡板即可。

    方案数:C(n-1,m-1)

    8.小球相同,盒子不同,允许有空盒子。

    考虑转换为问题7。

    往每个盒子里额外放一个小球。

    变成了n+m个球,m个盒子的问题7。

    方案数:C(n+m-1,m-1)

  • 相关阅读:
    数据库表结构变动发邮件脚本
    .net程序打包部署
    无法登陆GitHub解决方法
    netbeans 打包生成 jar
    第一次值班
    RHEL6 纯命令行文本界面下安装桌面
    C语言中格式化输出,四舍五入类型问题
    I'm up to my ears
    How to boot ubuntu in text mode instead of graphical(X) mode
    the IP routing table under linux@school
  • 原文地址:https://www.cnblogs.com/eternhope/p/9778992.html
Copyright © 2011-2022 走看看