m个苹果放入n个盘子问题,n个盘子不同的问题

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个苹果。

        即 \large f(m,n)={C_{n}^{m}}f(m,m)

  • 当n <= m:不同的放法可以分成两类:含有0的方案数,不含有0的方案数
  1. 含有0的方案数,即有至少一个盘子空着,即相当于\large f(m,n)={C_{n}^{1}}f(m,n-1);
  2. 不含有0的方案数,即每个盘子至少有一个苹果,只需要将剩下的n-m个苹果放入盘子中即可,即相当于\large f(m,n)=f(m-n, n),因此当n<=m时,总共的放苹果的方法数为\large f(m,n)={C_{n}^{1}}f(m,n-1)+f(m-n, n)

递归出口条件说明:

  • 当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版权协议,转载请附上原文出处链接和本声明。