笔试题(十一):放苹果问题

# 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
# 注意:如果有7个苹果和3个盘子,(5,1,1)和(1,5,1)被视为是同一种分法。
# 数据范围:0≤m≤10,1≤n≤10。
# 输入描述:
# 输入两个int整数
# 输出描述:
# 输出结果,int型
def func2(m):
    # 方法1: 针对特殊数字的笨方法
    list1 = []
    for i in range(m):
        for j in range(m):
            if i + j <= m:
                temp = [i, j, m - i - j]
                temp.sort()
                if temp not in list1:
                    list1.append(temp)
    return list1, len(list1)


# 方法2思路如下:
# 1.假设有2个盘子为空,则只有1种分法,即求得(m, 1)即可
# 2.假设有1个盘子为空,则(m,n)问题转化为将m个苹果放在n-1个盘子上,即求得(m,n-1)即可(两个盘子为空属于一个盘子为空的子集,所以忽略1)
# 3.假设所有盘子都装有苹果,则每个盘子上至少有一个苹果,即最多剩下m-n个苹果,问题转化为将m-n个苹果放到n个盘子上, 即求(m-n,n)
# 综上可以归纳出通用公式:m份n盘问题 = m份(n-1)盘问题+
#                                (m-n)份n盘问题
# 所以,根据分析很容易得出结论:这是一个分解过程包含自身规律的问题-递归,所以建立递归函数计算
def func(m, n):
    if m < 0 or n < 0:
        return 0
    elif m == 1 or n == 1:
        return 1
    else:
        return func(m, n-1) + func(m-n, n)


if __name__ == '__main__':
    m = 7
    n = 3
    cnt = func(7, 3)
    print(cnt)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Trisyp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值