动态规划-分苹果:m个苹果,n个盘子的分法个数
題目:有m個蘋果,n個盤子,每個盤子都可以放無數個蘋果,問有多少種分法?例如有5個蘋果,5個盤子,則由(11111),(1112),(113),(14),(212),(23),(5)共7種分法。
分析:
這道題我有兩種解法,一種是回溯法,即設定一個列表[1,2,…m],然后對列表內的元素進行組合,組合條件有兩個,1),它們的和為m。2),它們的個數不能超過n。當滿足這種條件時,停止回溯,并記錄結果。最后看這樣的組合有多少個就行了。
另外一種是動態規劃法,這是我這篇文章要寫的解法。
因為m和n比較容易混淆誰是蘋果誰是盤子,因此這里用apples代表蘋果,用plates代表盤子。設f(apples,plates)函數代表當有apples個蘋果,plates個盤子時的分法。
1、當apples只有1個或者0個時,那不管盤子有多少個,那只有1種分法,即只在1個盤子里放蘋果,其他盤子都空著;
2、當plates只有1個時,那也只有1種分法,即把所有的蘋果都放在這個盤子里;
因此,我們可以得出,
if apples <=1 or plates == 1:
f(apples,plates) = 1
3、當plates > apples時,盤子比蘋果還多,那把多余的盤子撤了也不影響結果,
因此,我們可以得出,
if plates > apples:
f(apples,plates) = f(apples,apples)
4、當plates <= apples時,那可以分成兩種情況:a,沒有空盤子,即每個盤子上都放有蘋果;b,有空盤子,即至少有1個盤子里沒放蘋果。
設f(apples,plates)_a代表a情況下的分法, f(apples,plates)_b代表b情況下的分法,我們可以得出,
f(apples,plates) = f(apples,plates)_a + f(apples,plates)_b
對于沒有空盤子的情況,那我們可以給每個盤子上都放1個蘋果,然后把剩余的蘋果再分到這些盤子里。即f(apples,plates)_a = f(apples-plates,plates)
而對于有空盤子的情況,因為蘋果數量不變,而盤子數量會變少,即有1個空盤子,有2個空盤子,有3個空盤子,…有plates-1空盤子,因此我們可以知道:
即f(apples,plates)_b = f(apples,plates-1)+f(apples,plates-2)+f(apples,plates-3)+…+f(apples,1)
那么,f(apples,plates-1)怎么算呢?那么此時我們就又回到了第4步的起始位置,按照第4步的邏輯,再推導一遍可知:f(apples,plates-1) = f(apples,plates-1)_a + f(apples,plates-1)_b
f(apples,plates-1)_a = f(apples-(plates-1),plates-1)
f(apples,plates-1)_b = f(apples,plates-2)+f(apples,plates-3)+f(apples,plates-4)+…+f(apples,1)
觀察一下f(apples,plates)_b與f(apples,plates-1)_b的結果可以知道,f(apples,plates-2)+f(apples,plates-3)+f(apples,plates-4)+…+f(apples,1)被算了兩遍,因此可以得出一個重要的結論:只有1個空盤子的情況的分法里,已經包含了有2個空盤子、有3個空盤子…有plates-1個空盤子的情況。
因此,綜上,可以得出當plates<=apples時,
f(apples,plates) = f(apples-plates,plates) + f(appels,plates-1)
將上述四種情況用代碼實現如下(引入了字典備忘錄,以加快運行速率):
devide_dict = {} def devide_apple(apples,plates):if apples <= 1 or plates == 1:return 1if plates > apples:plates = applesreturn devide_apple(apples,plates)if (apples,plates) in devide_dict:return devide_dict[(apples,plates)]else:count = devide_apple(apples-plates,plates)+devide_apple(apples, plates-1)devide_dict[(apples,plates)] = countreturn count總結
以上是生活随笔為你收集整理的动态规划-分苹果:m个苹果,n个盘子的分法个数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算天数c语言pta,PTA练习7-9
- 下一篇: VMWare 导出vmdk并转为qcow