我們先來看這樣乙個問題:
把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...