# 把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)
09-08
10-05
597