把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
数据范围:0<=m<=10,1<=n<=10
用m表示苹果个数,n表示盘子个数,分几种情况:
1、当没有苹果或没有盘子时,没有分法
2、当只有1个苹果,或只有1个盘子,就只有一种分法
3、当苹果数大于盘子数(m>n)时:
3.1、当没有空盘时:即(m,n)=(m-n,n)。意思是先将n个苹果放进那个盘子,就只剩下m-n个苹果分到n个盘子
3.2、有1个空盘,即(m,n)=(m,n-1)。意思是去掉一个盘子,就只剩m个苹果分到n-1个盘子
4、当苹果数小于盘子数(m<n)时:
4.1、即(m,n)=(m,m),相当于将m个苹果分到m个盘子中
递归
def put(m, n):
if m == 1 or n == 1:
return 1
if m < n:
return put(m, m)
else:
return put(m - n, n) + put(m, n - 1)
def func():
while True:
try:
# 用m表示苹果个数,n表示盘子个数
m, n = map(int, input().strip().split())
print(put(m, n))
except:
break
if __name__ == "__main__":
func()
DP
def func():
while True:
try:
# 用m表示苹果个数,n表示盘子个数
m, n = map(int, input().strip().split())
dp = [[0 for i in range(m + 1)] for j in range(n + 1)]
dp[0][1] = 1
dp[1][0] = 1
for i in range(1, m):
for j in range(1, n):
if m < n:
dp[i][j] = dp[i][i]
elif m == n:
dp[i][j] = dp[i][j - 1] + 1
else:
dp[i][j] = dp[i - j][j] + dp[i][j - 1]
print(dp[m][n])
except:
break
if __name__ == "__main__":
func()