问题
m个相同的球装入n个不同的桶中,问共用多少种装法?(每个桶都能够放入 m m m个球)
思路
m个球放入n个桶中,方法可以分为放入1、2、3、……、k个桶中的不同种类方法,其中
k
=
m
i
n
(
m
,
n
)
k=min(m,n)
k=min(m,n),每种放法中有
(
n
k
)
n \choose k
(kn)种选桶方法,每种方法要求每个桶中至少要有1个球。
而选好桶后,这k个桶中球的放法问题又变为m-k个球放入k个桶中的放法问题,所以总的问题就可以采用递归的方式解决。考虑递归的结束条件,k的值最小为1,最大为m,因此迭代的过程中,所以迭代过程中m的最小值为0,n的最小值为1,因此设定:
f
(
n
,
m
)
=
f
(
n
,
0
)
=
1
f(n,m)=f(n,0)=1
f(n,m)=f(n,0)=1,且
f
(
n
,
m
)
=
f
(
1
,
m
)
=
1
f(n,m)=f(1,m)=1
f(n,m)=f(1,m)=1,递归式如下:
f
(
n
,
m
)
=
{
∑
i
=
1
k
(
n
i
)
f
(
i
,
m
−
i
)
,
n
≠
1
a
n
d
m
≠
0
1
,
n
=
1
o
r
m
=
0
f(n,m)= \begin{cases} \sum_{i=1}^{k}{n \choose i}f(i,m-i),&n\ne 1\ and\ m \ne0 \\ 1, &n=1\ or\ m=0 \end{cases}
f(n,m)={∑i=1k(in)f(i,m−i),1,n=1 and m=0n=1 or m=0
其中,
k
=
m
i
n
(
n
,
m
)
k = min(n,m)
k=min(n,m).
实现代码
"""
解决m个相同的球放到n个桶中,共有多少种方法的问题
"""
import math
def f(n,m):
if n==1:
return 1
elif m==0:
return 1
type_sum = 0
k = min(n,m)
for i in range(1, k+1):
type_sum += math.comb(n,i)*f(i,m-i)
return type_sum
# test
print(f(2,3))