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)

  • 相关阅读:
    javascirpt Scoket
    黑马程序员面试题(一)交通灯管理系统
    中软国际实习总结
    黑马程序员Java基础正则表达式
    黑马程序员Java基础加强Java高新技术
    黑马程序员JAVA基础GUI
    面试题(二)银行业务调度系统
    黑马程序员JAVA基础IO流之File 类
    黑马程序员JAVA基础IO流其他类
    黑马程序员Java基础网络编程
  • 原文地址:https://www.cnblogs.com/eternhope/p/9778992.html
Copyright © 2011-2022 走看看