盒子与球问题的八种情况(Python实现)
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):