演算法 動態規劃演算法

2021-09-07 21:20:27 字數 1362 閱讀 4903

動態規劃法基本思想:將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。

著名的應用例項有:求解最短路徑問題,揹包問題,專案管理,網路流優化等。

個人對動態規劃的理解,主要就是避免重複計算。就是那些曾經發生過的事情,曾經計算過的值先儲存下來,然後再次遇到相同的子問題的時候,直接用儲存好的值給出,不再進行計算。

有乙個很簡單的例子,關於斐波那契數列。

什麼是斐波那契數列?根據維基百科的解釋是這樣的,

費波那西數列(fibonacci sequence),又譯費波拿契數斐波那契數列費氏數列**分割數列

在數學上,費波那西數列是以遞迴的方法來定義:

用文字來說,就是費波那西數列由 0 和 1 開始,之後的費波那西係數就由之前的兩數相加。

寫出c語言的話,簡單就是這樣的:

int fib(int

n)

當你求fib(5)的時候,簡單到最後就是好多個fib(1)和fib (0)而已。

當n=5時,fib(5)的計算過程如下:

fib(5)fib(4) + fib(3)(fib(3) + fib(2)) + (fib(2) + fib(1))((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))(((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))

所以很多計算過程都是重複的,這樣對於計算機來說太浪費了,所以希望避免重複的過程再次發生,好比我們寫函式一樣,就是為了更加有效率。

利用動態規劃的思想,先將計算過的值儲存下來,之後如果發現有相同步驟的時候,直接將事先儲存好的值拿出來就好。

所以鄙人是這樣寫的:

//

動態規劃法

int m[10

];bool bn[10

];int fib2(int

n)

return

m[n];

}int _tmain(int argc, _tchar*ar**)

相比演算法導論給的例項,維基百科給的更加容易理解。(越來越發現自己離不開網路了)

演算法 動態規劃演算法

動態規劃法基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。著名的應用例項有 求解最短路徑問題,揹包問題,專案管理,網路流優化等。個人對動態規劃的理解,主要就是避免重複計算。就是那些曾經發生過的事情,曾經計算過的值先儲存下來,然後再次遇到相同的子問題的時候,直接用儲存...

演算法 動態規劃演算法

背 包問題 有乙個揹包,容量為 4磅 現有如下物品 物品 重量 吉他 g 1 1500 音響 s 4 3000 電腦 l 3 2000 1 要求達到的目標為裝入的揹包的總價值最大,並且重量不超出 2 要求裝入的物品不能重複 動態規劃的核心思想是把原來的問題分解成子問題進行求解,也就是分治的思想。但是...

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...