python 两种数量的丸子分到K个碗

遇到笔试题如下:
M个鱼丸,N个肉丸,K个碗,所有丸子都分到碗中,不能混装,可以有空碗。
数据:1≤M≤50,1≤N≤50,1≤K≤50,一个碗可以放任意多的丸子
比如 鱼丸1,肉丸1,碗3,分法(1,0,1)(1,1,0)(0,1,1)算一种分法。

print("输入鱼丸数量M,1≤M≤50")
M = int(input())
print("输入鱼丸数量N,1≤N≤50")
N = int(input())
print("输入碗数量K,1≤K≤50")
K = int(input())


# m个丸子放入n个碗的分法,允许有空
def fun1(m,n):
    if m == 0 or n == 1:
        return 1
    if n > m:
        return fun1(m, m)
    else:
        return fun1(m, n-1) +fun1(m-n, n)


# m个丸子放入n个碗的分法,不允许有空
def fun2(m,n):
    if m == n:
        return 1
    if m > n:
        return fun1(m-n,n)
    if m < n:
        return 0


def fun3(M,N,K):
    num = 0
    if K <= 1:
        return 0
    else:
        for i in range(1, K):   # 给1~k+1个碗分丸子,i个碗分M鱼丸,K+1-i个碗分N肉丸
            num1 = fun2(M,i)
            num2 = fun1(N, K-i)
            num += num1*num2
    return num

if __name__ == "__main__":
    num =fun3(M,N,K)
print("分法有 %d 种" % num)

想了一天,感觉这下应该是没有错的了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值