維基百科
動態規劃是一種在數學和
電腦科學
中使用的,用於求解包含
重疊子問題
的最優化
問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於電腦科學和工程領域。比較著名的應用例項有:求解
最短路徑
問題,揹包問題
,專案管理
,網路流
優化等。
動態規劃在查詢有很多重疊子問題的情況的最優解時有效。它將問題重新組合成子問題。為了避免多次解決這些子問題,它們的結果都逐漸被計算並被儲存,從簡單的問題直到整個問題都被解決。因此,動態規劃儲存遞迴時的結果,因而不會在解決同樣的問題時花費時間。
動態規劃只能應用於有最優子結構的問題。最優子結構的意思是區域性最優解能決定全域性最優解(對有些問題這個要求並不能完全滿足,故有時需要引入一定的近似)。簡單地說,問題能夠分解成子問題來解決。
最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質(即滿足最優化原理)。最優子結構性質為動態規劃演算法解決問題提供了重要線索。
子問題重疊性質。子問題重疊性質是指在用遞迴演算法自頂向下對問題進行求解時,每次產生的子問題並不總是新問題,有些子問題會被重複計算多次。動態規劃演算法正是利用了這種子問題的重疊性質,對每乙個子問題只計算一次,然後將其計算結果儲存在乙個**中,當再次需要計算已經計算過的子問題時,只是在**中簡單地檢視一下結果,從而獲得較高的效率。
計算斐波那契數列(fibonacci polynomial)的乙個最基礎的演算法是,直接按照定義計算:
functionfib(n)ifn = 0orn = 1return1returnfib(n − 1) + fib(n − 2)當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))
由上面可以看出,這種演算法對於相似的子問題進行了重複的計算,因此不是一種高效的演算法。實際上,該演算法的運算時間是指數級增長的。 改進的方法是,我們可以通過儲存已經算出的子問題的解來避免重複計算:
array map [0...n] =將前n個已經算出的前n個數儲存在陣列map中,這樣在後面的計算中可以直接易用前面的結果,從而避免了重複計算。演算法的運算時間變為o(n)fib( n )
if ( map m does not contain key n)
m[n] := fib(n − 1) + fib(n − 2)
return m[n]
揹包問題作為np完全問題,暫時不存在多項式時間演算法。動態規劃屬於揹包問題求解最優解的可行方法之一。此外,求解揹包問題最優解還有搜尋法等,近似解還有貪心法等,分數揹包問題有最優貪心解等。 揹包問題具有最優子結構和重疊子問題。動態規劃一般用於求解揹包問題中的整數揹包問題(即每種物品所選的個數必須是整數)。 解整數揹包問題: 設有n件物品,每件價值記為pi,每件體積記為vi,用乙個最大容積為vmax的揹包,求裝入物品的最大價值。 用乙個陣列f[i,j]表示取i件商品填充乙個容積為j的揹包的最大價值,顯然問題的解就是f[n,vmax].
f[i,j]=
f[i-1,j]對於特例01揹包問題(即每件物品最多放1件,否則不放入)的問題,狀態轉移方程:0
f[i,j]=
f[i-1,j]參考pascal**0
for i:=1to n do
for j:=totv downto v[i]
do f[j]
:=max(f[j]
,f[j-v[i]
]+p[i]
);writeln
(f[totv]
);
動態規劃 1
動態規劃是對最優化問題的一種新的演算法設計方法。由於各種問題的性質不同,確定最優解的條件也互不相同,因而動態規劃的沒計法對不同的問題,有各具特色的表示方式。不存在一種萬能的動態規劃演算法。但是可以通過對若干有代表性的問題的動態規劃演算法進行討論,學會這一設計方法。多階段決策過程最優化問題 動態規劃的...
動態規劃1
首先,動態規劃的最基本要求在於無後效性 即結果態之和之前某態有關,並且對於該之前態我們並不關心它到底是怎麼來的 和n到n 1的跳躍一樣,它也是依賴轉移方程得來。比如0 1揹包 我們只要永遠依賴dp i j max dp i 1 j,dp i 1 j wi vi 這個轉移方程即可,並不在乎它具體細節。...
動態規劃 1
p1060 開心的金明 揹包問題 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n元。於是,他...