python 動態規劃實現整數拆分

2021-10-05 16:15:29 字數 1522 閱讀 4338

我們先來看這樣乙個問題:

把5拆分成若干無序正整數的和(若干可以包含1),請問有多少種拆分方法?

直接用列舉法實現:

5 = 5

5 = 4+1

5 = 3+2

5 = 3+1+1

5 = 2+2+1

5 = 2+1+1+1

5 = 1+1+1+1+1

很顯然,結果為7。注意這裡5 = 4+1和5=1+4是相同的,只計算為一種方法。(如果計算為兩種,那麼屬於有序拆分,實現起來較為容易,用排列組合中的插板法即可)

可以發現當待拆分數很小時,比較容易列舉出答案。

但是若要將10進行拆分,結果有42種;若要將20進行拆分,結果有627種;若要將30進行拆分,結果有5604種;若要將40進行拆分,結果有37338種···難度直線上公升

網上搜尋發現有很多種方法來解決這類問題,如遞迴,動態規劃,母函式法,五邊形法等等,本文只挑選較為容易理解的前兩種來進行討論。

def

getpartitioncount

(n,m)

:#遞迴演算法

if n ==

1or m ==1:

return

1elif n < m:

return getpartitioncount(n,n)

elif n == m:

return

1+ getpartitioncount(n,n-1)

else

:return getpartitioncount(n-m,m)

+ getpartitioncount(n,m-

1)

該演算法的優點是**簡單明瞭,但是時間複雜度為o(2^n),計算f(100)需要幾分鐘!

二、動態規劃

動態規劃的演算法是基於遞迴演算法的,但是不需要遍歷整個二叉樹,時間複雜度為o(n^2)。

先上**,再根據**進行解釋。

def

gpc3

(n):

if n <0:

return

0 dp =[1

]+[0

]*n

for num in

range(1

,n+1):

for i in

range

(num,n+1)

: dp[i]

+= dp[i-num]

return dp[-1

]

還是以f(5)為例,生成的dp列表如下

其中的資料對應每乙個函式值,如下

小劉盲拆動態規劃

給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3 4,1,2,1,5 4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。python實現...

動態規劃python實現

考慮乙個場景 當你有去沙漠旅行,你有乙個揹包和一些物品,揹包有最大承受重量,物品也有重量和價值,而物品種類很多,不可能全都裝在揹包裡,如何去選取價值總量最高的物品組合呢?物品名價值 water 10book 3food 9jacket 5camera 6物品名 重量water 3kgbook 1kg...

動態規劃 整數拆分

時間限制 1秒 空間限制 65536k 熱度指數 8566 乙個整數總可以拆分為2的冪的和,例如 7 1 2 4 7 1 2 2 2 7 1 1 1 4 7 1 1 1 2 2 7 1 1 1 1 1 2 7 1 1 1 1 1 1 1 總共有六種不同的拆分方式。再比如 4可以拆分成 4 4,4 1...