盒子与球问题的八种情况(Python实现)

盒子与球问题的八种情况(Python实现)

参考文献:(http://hahata.org/647/)

import math
#考虑每个小球有m个盒子可以选择放入,而一共又有n个小球,所以方案数为m^n
def different_ball_different_box_empty(ball,box):
    return(box**ball)

#考虑插板法:将n个小球排成一排,将m−1块板子插在小球之间的空隙中,由于一共有n−1个缝隙,所以答案为Cm−1n−1。
def same_ball_different_box_no_empty(ball,box):
    return(math.factorial(ball-1)//(math.factorial(box-1)*math.factorial(ball-box)))

#考虑插板后的结果,是m−1块板子和n个小球一共n+m−1个物体排成一排,考虑这些物体中有m−1个板子即是一种方案,所以答案为Cm−1n+m−1。
def same_ball_different_box_empty(ball,box):
    return(math.factorial(ball+box-1)//(math.factorial(box-1)*math.factorial(ball)))

#考虑递推,设F[n][m]表示将n个小球放入m个盒子中的方案数。由于小球互不相同,考虑第i个小球的方法,可以是放到前i−1个小球已经放过的盒子中,也可以放到一个新盒子中。
#假设前i−1个小球已经占用了j个盒子,由于小球互不相同,故放了小球的盒子也应该被视为互不相同的,所以将第i个小球放入这些盒子共有j种不同方案。如果将第i个小球放入一个新盒子,由于盒子都是相同的,所以只有一种方案。
#综上所述,最后的递推式为F[i][j]=j⋅F[i−1][j]+F[i−1][j−1]。
def different_ball_same_box_no_empty(ball,box):
    if(box==1):
        
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值