m个相同的球放n个桶问题的解决方法

问题

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,mi),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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值