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 行...