演算法導論 0 1揹包問題 與 部分揹包

2021-08-26 11:29:00 字數 2463 閱讀 1896

【0-1揹包】 問題描述:n件物品,第i件物品價值 v[i] 元,重w[i] 磅。希望用 w磅的書包 拿走總價值最貴的物品。(物品不可以分割故稱為0-1揹包)

【部分揹包】問題描述:n件物品,第i件物品價值 vi 元,重wi 磅。希望用 w磅的揹包 拿走最重的物品。第i件物品可以都拿走,也可以拿走一部分。(物品可以分割所以稱為部分揹包)

注意:0-1揹包不能用貪心演算法求解。

原因:按照貪心演算法,每一次拿的都是每磅最貴的物品。由於物品大小不同,有可能每磅最貴的不是最合適大小的。最壞的情況可能導致,揹包沒有裝滿,而且當前裝的也不是最優的。

例如:10磅 a 價值60¥ ; 20磅 b 價值100¥;30磅 c 價值120¥; 揹包重50磅

按照貪心演算法 ,應該選擇 a b (160¥) 但是最優的應該是 bc(220¥)

分析:沒有裝滿的揹包降低了平均每磅物品的價值,將物品裝入時必須考慮

1)裝入物品i後子問題的解

2)不裝入物品i後子問題的解哪個最優。

這樣導致了許多子問題重疊,而這又恰巧是動態規劃特點。

部分揹包,顯而易見可以用貪心演算法。

【0-1揹包】問題描述:

有n件物品和乙個容量為v的揹包。第i件物品的費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使價值總和最大。所謂0-1揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。

二, 解決方案:

考慮使用動態規劃(dynamic programming)問題求解,定義乙個遞迴式 opt[i][v] 表示前i個物品,在揹包容量大小為v的情況下,最大的裝載量。

opt[i][v] = max(opt[i-1][v] , opt[i-1][v-c[i]] + w[i])

解釋如下:

opt[i-1][v] 表示第i件物品不裝入揹包中,而opt[i-1][v-c[i]] + w[i] 表示第i件物品裝入揹包中。

花費如下:

時間複雜度為o(v * t) ,空間複雜度為o(v * t) 。 時間複雜度已經無法優化,但是空間複雜度則可以進行優化。但必須將v 遞減的方式進行遍歷,即v.......0 的方式進行。

三,初始化:

(1)若要求揹包必須放滿,則初始如下:

f[0] = 0 , f[1...v]表示-inf。表示當容積為0時,只接受乙個容積為0的物品入包。

(2)若要求揹包可以空下,則初始化如下:

f[0...v] = 0 ,表示任意容積的揹包都有乙個有效解即為0。

具體解釋如下:

初始化的f陣列事實上就是在沒有任何物品可以放入揹包時的合法狀態。

如果要求揹包恰好裝滿,那麼此時只有容量為0的揹包可能被價值為0的nothing「恰好裝滿」,

其它容量的揹包均沒有合法的解,屬於未定義的狀態,它們的值就都應該是-∞了。

如果揹包並非必須被裝滿,那麼任何容量的揹包都有乙個合法解「什麼都不裝」,

這個解的價值為0,所以初始時狀態的值也就全部為0了。

四,**如下:

/*

01揹包,使用了優化後的儲存空間

建立陣列

f[i][v] = max(f[i-1][v] , f[i-1][v-c[i]] + w[i])

將前i件物品,放入容量為v的揹包中的最大值。

下面介紹乙個優化,使用一維陣列,來表示

(1) f[v]表示每一種型別的物品,在容量為v的情況下,最大值。

但是體積迴圈的時候,需要從v----1迴圈遞減。

初始化問題:

(1)若要求揹包中不允許有剩餘空間,則可以將f[0]均初始化為0,其餘的f[1

表示只有當容積為0 的時候,允許放入質量為0的物品。

而當容積不為0的情況下,不允許放入質量為0的物品,並且把狀態置為未知狀態。

(2)若要求揹包中允許有剩餘空間 ,則可以將f[1n],均初始化為0。

這樣,當放不下去的時候,可以空著。

*/#includeusingnamespace std ; constint v=1000 ;//總的體積 constint t=5 ;//物品的種類 int f[v+1] ; //#define empty//可以不裝滿 int w[t] =;//價值 int c[t] =;//每乙個的體積 constint inf=-66536 ; int package() } return f[v] ; } int main()

0 1揹包與部分揹包

0 1揹包 問題描述 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。所謂0 1揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。解決方案 考慮使用動態規劃 dynamic programming 問題求解 假定ak是放入的最後乙個物...

01揹包與部分揹包

有n件物品和乙個容量為c的揹包,第i件物品的費用是w i 價值是v i 求在不超過揹包的最大容量下,求能得到最大的價值 dp i j 表示前i件物品放入乙個容量為j的揹包可以獲得的最大價值 考慮第i件物品 放與不放 那麼就有兩種狀態。如果不放,那麼當前價值dp i j dp i 1 j 1 也就是和...

演算法(揹包問題 01揹包問題)

01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...