給定乙個容量為c的揹包,重量為weight,價值為value的石頭,求揹包能容納的最大價值。
例
weight =[1
,2,3
]value =[6
,10,12
]c =
5輸出:22
揹包中放入乙個重量為3的石頭和乙個重量為2的石頭
value =10+
12=22.
public
intfindres
(int
weight,
int[
] value,
int capcity)
//f(n, c) 考慮[0 - n] 中揹包重量為c的最優解
//狀態轉移方程為 f(n, c) = math.max(不考慮最後乙個石頭, 最後乙個石頭的價值 + 考慮最後乙個石頭後剩餘揹包容量的最大值);
//狀態轉移方程為 f(n, c) = math.max(f(n - 1, c), v[n] + f(n - 1, c - w[n]));
private
inthelper
(int
weight,
int[
] value,
int capcity,
int index)
不難發現此種解法會有重疊計算的問題
我們開闢乙個空間儲存之前計算的結果
public
intfindres2
(int
weight,
int[
] value,
int capcity)
//f(n, c) 考慮[0 - n] 中揹包重量為c的最優解
//狀態轉移方程為 f(n, c) = math.max(不考慮最後乙個石頭, 最後乙個石頭的價值 + 考慮最後乙個石頭後剩餘揹包容量的最大值);
//狀態轉移方程為 f(n, c) = math.max(f(n - 1, c), v[n] + f(n - 1, c - w[n]));
private
inthelper2
(int
weight,
int[
] value,
int capcity,
int index,
int[
] memo)
//時間複雜度為o(c * n) 其中c為揹包容量,n為石頭個數
//空間複雜度為o(c * n) 其中c為揹包容量,n為石頭個數
private
intfindres3
(int
weight,
int[
] value,
int capcity)
for(
int i =
1; i < weight.length; i ++)}
return memo[weight.length -1]
[capcity]
;}
可以發現i
行資料依賴於i - 1
行資料,所以我們只要重用空間就可以只使用2行記錄狀態。
//時間複雜度為o(c * n) 其中c為揹包容量,n為石頭個數
//空間複雜度為o(c * 2) 其中c為揹包容量
private
intfindres4
(int
weight,
int[
] value,
int capcity)
for(
int i =
1; i < weight.length; i ++)}
return memo[
(weight.length -1)
&1][capcity]
;}
在此深入可以發現,每一行資料只依賴上一行資料的左邊資料,所以我們可以將資料儲存實現在一行上。
//時間複雜度為o(c * n) 其中c為揹包容量,n為石頭個數
//空間複雜度為o(c) 其中c為揹包容量
private
intfindres5
(int
weight,
int[
] value,
int capcity)
//右邊資料依賴於左邊資料,所以只要開闢o(c)空間
for(
int i =
1; i < weight.length; i ++)}
return memo[capcity]
;}
public
static
void
main
(string[
] argc)
;int
value =
newint
;int res =
newpakage01()
.findres
(weight, value,5)
; system.out.
println
(res)
;}
通俗理解0 1揹包問題解法
0 1揹包問題是乙個很經典的問題,使用動態規劃演算法來求解也是很經典的。下面我用乙個例子來講解用動態規劃演算法求解0 1揹包問題。假設商店中有5件東西,重量用w表示,用v表示 現在有乙個小偷來到了小店中,這哥們帶了乙個袋子,但是這個袋子只能裝20公斤 w 20 的東西,問題來了,他怎麼樣偷才能拿到總...
01揹包問題 C 解法
01揹包問題 假設現有容量m的揹包,有i個物品,重量分別為w 1 w 2 w i 價值分別為p 1 p 2 p i 將哪些物品放入揹包可以使得揹包的總價值最大?最大價值是多少?示例1 m 10,i 3,物品重量 價值 3 4 4 5 5 6 第一種 不帶備忘的自頂向下法 using system n...
01揹包問題 優化及變形
問題描述 有n件商品,第i件商品的重量是weights i 1 價值是values i 1 揹包容量是cap 則揹包能夠裝物品的最大價值首先構建乙個二維陣列dp,dp i j 表示第i件物品時揹包容量為j時的最大價值。如何求得dp i j 1 values i 1 j,說明第i件物品不能放入當前容量...