網上已經有許多關於,m個蘋果放入n個盤子的問題(盤子相同),但是沒有具體關於n個盤子不同的問題,在這裡根據前面的n個盤子相同的基礎上,進行分析得出相應的遞推公式。針對前一問題這裡不再詳細介紹,具體的網頁鏈結為:
問題描述:
問題描述:把m個同樣的蘋果放在n個不同的盤子裡,允許有的盤子空著不放,問有多少種不同的分法?(注:5,1,1和1,1,5是不同的分法)
解題分析:
設f(m,n)為m個蘋果,n個盤子的放法數目,則先對n作討論,
即含有0的方案數,即有至少乙個盤子空著,即相當於
不含有0的方案數,即每個盤子至少有乙個蘋果,只需要將剩下的n-m個蘋果放入盤子中即可,即相當於
遞迴出口條件說明:
用遞迴的解法:
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]
m個蘋果放入n個盤子問題
題目 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1 是同一種分法。輸入每個用例包含二個整數m和n。0 m 10,1 n 10。0 n 10 m 10 解題思路 我們首先定義dp i j 表示i個蘋果,j個盤子的分法總數 1.當盤...
m個蘋果放入n個盤子問題
這個問題,看似是乙個簡單的排列組合問題,但是加上不同的限制條件,會演變成不同的問題,感覺很奇妙,就總結一下列舉下來 問題一 問題描述 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問有多少種不同的分法?注 5,1,1和1,1,5是同一種分法 解題分析 設f m,n 為m個蘋果,n個盤子...
m個蘋果放入n個盤子
放蘋果問題 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?注 5,1,1和1,1,5是同一種分法 解題分析 設f m,n 為m個蘋果,n個盤子的放法數目,則先對n作討論,當n m 必定有n m個盤子永遠空著,去掉它們對擺放蘋果方法數目不產生影響。即if n m ...