01揹包問題解法及優化

2021-10-03 17:01:19 字數 2661 閱讀 5086

給定乙個容量為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件物品不能放入當前容量...