演算法(一) 動態規劃法

2021-10-24 00:18:32 字數 2264 閱讀 1247

使用乙個二維陣列 val[i][j] 存放當前容量下的最大價值,其中第 i 行表示可選物品中加入 第 i 個物品, j 為當前揹包的假設容量,val[i][j] 表示假設當前的揹包的最大容量為 j ,在可選的物品中加入第 i 個物品後,揹包能裝入的物品的最大價值,val[i][j] 值的選取方法如下:

初始化第 0 行和第 0 列為0 ,表示當沒有可選物品或者當前揹包容量為 0 時,揹包能裝入的最大價值為 0;

判斷當前假設的揹包最大容量是否大於第 i 個物品的大小

– 如果大於,則使用不加入第 i 個物品時候的最大價值與 當物品的價值 + 容量為(當前假設的揹包容量大小 - 當前物品的大小)的揹包能放入物品的最大價值,取兩者中的最大值,即 max(val[i-1][j],value[i] + val[i- 當前物品的大小]);

– 如果小於,則將上一和當前假設揹包的大小一樣的最大價值複製到當前位置,即 val[i][j] = val[i-1][j]

揹包能裝入的最大價值為最右下角的值,即 val[val.length-1][val[0].length-1]

若需要記錄價值最大時揹包所裝入的物品,則需要使用一二維陣列記錄當前path[i][j] 記錄當前物品是否加入到揹包中,步驟 3 中,val[i-1][j] 小於 value[i] + val[i- 當前物品的大小],則標記當前物品加入到揹包中,但由於當前揹包容量 j 是動態的,所以被標記加入揹包中的物品最終也不一定被加入到揹包中。從下往上(i->0) 遍歷二維陣列path[i][j],揹包容量最大時,遇到的第乙個被標記加入包中的物品一定被加入包中(因為此時是所有物品都可選,不會再有新的物品再加入,且揹包容量為最大,所以當前值已經為揹包的所能裝入的最大價值),揹包容量減去當前物品的大小,如果當前揹包容量下,該物品被標記放入揹包中,則該商品在揹包容量最大且所有商品都可選放入揹包中的狀態下,揹包裝入的物品價值最大時該商品也在揹包中(因為後面有商品可以放入包中,當前是減去後面商品的大小後的容量,且在當前容量下揹包可以裝入的值可以達到最大)

實現**:

public

class

knapsack

;int weight=

;int capacity=4;

knapsack knapsack=

newknapsack()

; system.out.

println

(knapsack.

findmaxval

(val,weight,4)

);}/**

** @param val 物品的價值

* @param weight 物品的重量

* @param capacity 揹包的容量

* @return

*/public

intfindmaxval

(int

val,

int[

] weight,

int capacity)

for(

int j=

0; j< v.length; j++

)// //i為第 i個商品,j為假設的揹包容量

for(

int i=

1; i

)else

else}}

}// 從最後乙個物品開始遍歷,取出最後乙個放入揹包的物品,並減去當前揹包的容量

int row= v.length-1;

//行的最大下標(即第row+1個物品)

int col=v[0]

.length-1;

//列的最大下標(即當前剩餘容量為col)

while

(row>

0&& col>0)

row--;}

system.out.

println

("*****====");

for(

int i=

0; i

) system.out.

println()

;}system.out.

println

("*****====");

for(

int i=

0; i

) system.out.

println()

;}return v[val.length]

[capacity];}

}

動態規劃法(一)

一 引言 動態規劃 dynamic programming 一詞源於研究優化問題的數學理論,動態規劃法的發明人貝爾曼 richard e.bellman 稱,選擇 dynamic 一詞純粹是看中了單詞本身的魅力,而不是其內在語義。programming 在研究優化的領域中標識 搜尋最優程式 的意思。...

動態規劃法

在學習動態規劃法之前,我們先來了解動態規劃的幾個概念 1 階段 把問題分成幾個相互聯絡的有順序的幾個環節,這些環節即稱為階段。2 狀態 某一階段的出發位置稱為狀態。3 決策 從某階段的乙個狀態演變到下乙個階段某狀態的選擇。4 狀態轉移方程 前一階段的終點就是後一階段的起點,前一階段的決策選擇匯出了後...

動態規劃法

有些問題在分解時會產生許多子問題,且分解出的自問題互相交織,因而在解這類問題時,將可能重複多次解乙個子問題。這種重複當然是不必要的,解決方法可以在解決每個子問題後把它的解 包括其子子問題的解 保留在乙個 中,若遇到求與之相同的子問題時,dp演算法又稱動態規劃,是資訊學競賽中選手必須熟練掌握的一種演算...