簡單分析 動態規劃 01揹包

2021-10-11 07:50:48 字數 2486 閱讀 9453

01揹包問題:假設你有乙個揹包,可以裝4㎏東西,但是你有很多東西比如;錘子(1000元,1kg),棒子(1500元,2kg),棍子(2000元,1kg)…等。你要怎麼樣在你的書包裡放入組合起來價值最大的物品。簡而言之,在有限的空間怎樣搭配才可以裝入最大價值的東西,並且物品不重複。

窮舉法:把所有的可能性都列舉出來,然後一一對比,可以達到乙個解決問題的目的,但是可選擇的物品如果多一些,從時間上和效率上,並不可取。

動態規劃與分治演算法類似,都是把大問題拆分成小問題,但是不同於分治演算法的是,動態規劃拆分後的每個小問題的解都取決與上乙個問題的解,動態規劃裡的每個結果都是互相依賴的,最後的結果也是一層一層的推出來的,就好像是填表,一張結果有序的表,是不是得從上往下或從左到右依次計算然後填上結果,為什麼呢,因為計算出本次的值才方便計算下乙個值,動態規劃也是一樣的思想。在動態規劃裡表的最後乙個值就是結果。

物品的重量羅列出來,放入w陣列中

int[ ] w =

物品價值也羅列出來,放入val陣列

int[ ] val =

揹包的容量儲存下來,記作m

int m = 4;

物品個數也儲存下來,記作n

int n = val.length;

建立二維陣列儲存每次放入的結果。

int [ ] [ ] v = new int [n + 1] [m + 1]

往揹包裡放入物品的話有兩種情況

第一,包的容量比該商品體積小,裝不下,此時的價值與前i-1個的價值是一樣的,即 v [ i ] [ j ] = v[ i - 1 ] [ j ]

第二,還有足夠的容量可以裝該商品,但裝了也不一定達到當前最優價值,所以在裝與不裝之間選擇最優的乙個,即 v [ i ] [ j ] = math.max(v [i - 1] [ j ] , val [ i - 1] + v[ i - 1] [ j - w[ i - 1] ])

得出兩個遞推關係式:(比較重要重點理解)

如果 w[ i ] > j

v [ i ] [ j ] = v[ i - 1 ] [ j ]

如果w[ i ] < j

v [ i ] [ j ] = math.max(v [i - 1] [ j ] , val [ i - 1] + v[ i - 1] [ j - w[ i - 1] ])

然後就可以根據這兩個公式乙個乙個的填表

public

class

knapsackproblem

;//物品得價值

int[

] val =

;// 揹包得容量

int m =4;

//物品得個數

int n = val.length;

// 建立二維陣列

// v[i][j] 表示前i個物品中能夠裝入容量為j得揹包

//中得最大價值

int[

] v =

newint

[n +1]

[m +1]

;// 初始化第一行和第一列

for(

int i =

0; i < v.length; i++

)for

(int i =

0; i < v[0]

.length; i++

)// 為了記錄儲存記錄 定義乙個陣列

int[

] path =

newint

[n+1

][m+1]

;// 根據公式取動態處理揹包問題

//不處理第一行

for(

int i =

1; i < v.length; i++

)else

if(v[i -1]

[j]< val[i -1]

+ v[i -1]

[j - w[i -1]

])}}

}for

(int i =

0; i < v.length; i++

) system.out.

println()

;}system.out.

println

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

// 我們只需要最後乙個策略 所有倒著遍歷

int i = path.length -1;

int j = path[0]

.length -1;

while

(i >

0&& j >0)

i--;}

}}

動態規劃核心思想就是用上乙個最優結果推出下乙個最優結果,就減少了很多的重複計算,每次得到的結果都是建立在上乙個最優解上,所以每次得到的結果也是最優解,進而可以推出下一次的最優解,這就是動態規劃很精妙的地方。

禿頭萌新一枚 希望可以幫助到大家理解

簡單0 1揹包問題 動態規劃

動態規劃最經典問題 0 1揹包問題,但是經典的0 1揹包問題給每個物品賦予兩種屬性 重量 價值 往往初次看此問題時難度較大。為了便於理解,先從經典的0 1揹包問題提取一種屬性進行分析 重量 題目如下 將上述過程轉化為 為 揹包中物品總重量的最大值 param weight 每個物品的重量陣列 par...

動態規劃 01揹包

最優二叉查詢樹.cpp 定義控制台應用程式的入口點。01揹包問題。include stdafx.h include include define n 3 the number of real node define m 10 using namespace std int tmain int arg...

01揹包動態規劃

0 1揹包 問題描述 乙個旅行者有乙個最多能用 m公斤的揹包,現在有 n件物品,它們的重量 分別是w1,w2 wn,它們的價值分別為 c1,c2,cn.若每種物品只有一 件求旅行者能獲得最大總價值。輸入格式 w 第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 w第2.n 1 行...