把 M 个同样的苹果放在 N 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
注意:5、1、1 和 1、5、1 是同一种分法,即顺序无关。
动态规范
while True: try: m,n = list(map(int,input().split())) reuslts = [[0 for i in range(n + 1)] for j in range(m + 1)] #reuslts[i][j]表示j个盘子装i个苹果 for i in range(1,m+1): reuslts[i][1] = 1 for j in range(2,n+1): if i < j: #盘子比苹果多并不会增加分法 reuslts[i][j] = reuslts[i][j - 1] elif i == j: #盘子和苹果一样多,相当于多了一个全部盘子只摆一个,其他摆法起码有一个空盘 reuslts[i][j] = reuslts[i][j - 1] + 1 else: #盒子比苹果少,等于有一个空盘加上全部盘摆上一个苹果剩余的摆法 reuslts[i][j] = reuslts[i - j][j] + reuslts[i][j - 1] print(reuslts[m][n]) except Exception as message: print(message) break
while True:#允许读入多组样例 try: def solution(m,n,k):#m个苹果放入n个盘子,每个盘子不得少于k #若n个盘子每个盘子放入k个恰好放完,则有1种解法 if k*n==m: return 1 #若剩下的m个苹果无法使得每个盘子的苹果都不少于k个,则无解 elif k*n>m: return 0 res=0 for i in range(k,m+1): for j in range(1,n+1): #若前j个盘子每个盘子都放入i个苹果,那么问题变为剩下m-i*j个苹果放入剩下n-j个盘子,每个盘子至少放i+1个,有几种放法 res+=solution(m-i*j,n-j,i+1) return res #读入数据 m,n=list(map(int,input().split(' '))) #输出结果 print(solution(m,n,0)) except EOFError: break