動態規劃1

2021-06-07 08:58:06 字數 2309 閱讀 1216

維基百科

動態規劃是一種在數學和

電腦科學

中使用的,用於求解包含

重疊子問題

的最優化

問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態規劃的思想是多種演算法的基礎,被廣泛應用於電腦科學和工程領域。比較著名的應用例項有:求解

最短路徑

問題,揹包問題

,專案管理

,網路流

優化等。

動態規劃在查詢有很多重疊子問題的情況的最優解時有效。它將問題重新組合成子問題。為了避免多次解決這些子問題,它們的結果都逐漸被計算並被儲存,從簡單的問題直到整個問題都被解決。因此,動態規劃儲存遞迴時的結果,因而不會在解決同樣的問題時花費時間。

動態規劃只能應用於有最優子結構的問題。最優子結構的意思是區域性最優解能決定全域性最優解(對有些問題這個要求並不能完全滿足,故有時需要引入一定的近似)。簡單地說,問題能夠分解成子問題來解決。

最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質(即滿足最優化原理)。最優子結構性質為動態規劃演算法解決問題提供了重要線索。

子問題重疊性質。子問題重疊性質是指在用遞迴演算法自頂向下對問題進行求解時,每次產生的子問題並不總是新問題,有些子問題會被重複計算多次。動態規劃演算法正是利用了這種子問題的重疊性質,對每乙個子問題只計算一次,然後將其計算結果儲存在乙個**中,當再次需要計算已經計算過的子問題時,只是在**中簡單地檢視一下結果,從而獲得較高的效率。

計算斐波那契數列(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] = 

fib( n )

if ( map m does not contain key n)

m[n] := fib(n − 1) + fib(n − 2)

return m[n]

將前n個已經算出的前n個數儲存在陣列map中,這樣在後面的計算中可以直接易用前面的結果,從而避免了重複計算。演算法的運算時間變為o(n)

揹包問題作為np完全問題,暫時不存在多項式時間演算法。動態規劃屬於揹包問題求解最優解的可行方法之一。此外,求解揹包問題最優解還有搜尋法等,近似解還有貪心法等,分數揹包問題有最優貪心解等。 揹包問題具有最優子結構和重疊子問題。動態規劃一般用於求解揹包問題中的整數揹包問題(即每種物品所選的個數必須是整數)。 解整數揹包問題: 設有n件物品,每件價值記為pi,每件體積記為vi,用乙個最大容積為vmax的揹包,求裝入物品的最大價值。 用乙個陣列f[i,j]表示取i件商品填充乙個容積為j的揹包的最大價值,顯然問題的解就是f[n,vmax].

f[i,j]=

f[i-1,j] 

0

對於特例01揹包問題(即每件物品最多放1件,否則不放入)的問題,狀態轉移方程:

f[i,j]=

f[i-1,j] 

0

參考pascal**

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元。於是,他...