m个苹果放入n个盘子问题,n个盘子不同的问题
网上已经有许多关于,m个苹果放入n个盘子的问题(盘子相同),但是没有具体关于n个盘子不同的问题,在这里根据前面的n个盘子相同的基础上,进行分析得出相应的递推公式。针对前一问题这里不再详细介绍,具体的网页链接为:https://www.cnblogs.com/wxgblogs/p/5742618.html
问题描述:
问题描述:把m个同样的苹果放在n个不同的盘子里,允许有的盘子空着不放,问有多少种不同的分法?(注:5,1,1和1,1,5是不同的分法)
解题分析:
设f(m,n)为m个苹果,n个盘子的放法数目,则先对n作讨论,
- 当n>m:则必定有n-m个盘子永远空着,我们首先选择m个盘子来放置苹果,可以等价为在m个盘子里面放置m个苹果。
即
- 当n <= m:不同的放法可以分成两类:含有0的方案数,不含有0的方案数
- 含有0的方案数,即有至少一个盘子空着,即相当于
;
- 不含有0的方案数,即每个盘子至少有一个苹果,只需要将剩下的n-m个苹果放入盘子中即可,即相当于
,因此当n<=m时,总共的放苹果的方法数为
递归出口条件说明:
- 当n=1时,所有苹果都必须放在一个盘子里,所以返回1;
- 当m==0(没有苹果可放)时,定义为1种放法。
用递归的解法:
from scipy.special import comb, perm
def fun(m, n): #m为苹果总数,n为盘子总数
if m == 0 or n == 1:
return 1
if n > m:
return comb(n,m)*fun(m,m)
else:
return comb(n, 1)*fun(m, n-1) + fun(m-n, n)用动态规划的解法:
def getDP(m, n):
matrix = [[0 for j in range(n+1)] for i in range(m+1)]
for i in range(m+1):
matrix[i][0] = 0 #将i个苹果总共加到0个位置,没有盘子可以放苹果
matrix[i][1] = 1 #将i个苹果加到1个位置上,总共只有一种放苹果的方法
for j in range(n+1):
matrix[0][j] = 1 #总共j个位置,不放苹果只有一种方法
for i in range(1, m+1, 1):
for j in range(1, n+1, 1):
if i < j:
matrix[i][j] = int(comb(j, i)*matrix[i][i])
else:
matrix[i][j] = int(comb(j, 1)*matrix[i][j - 1] + matrix[i-j][j])
for i in matrix:
print(i)
return matrix[m][n]
版权声明:本文为xinkengruo3162原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。