日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划-分苹果:m个苹果,n个盘子的分法个数

發布時間:2023/12/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划-分苹果: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个盘子的分法个数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。