0 1揹包與部分揹包

2021-07-13 06:32:10 字數 1974 閱讀 1927

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

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

解決方案:

考慮使用動態規劃(dynamic programming)問題求解

假定ak是放入的最後乙個物品。它的重量為wk,它的價值為vk。我們定義乙個函式c[i, w]表示到第i個元素為止,在限制總重量為w的情況下我們所能選擇到的最優解。那麼這個最優解要麼包含有i這個物品,要麼不包含,肯定是這兩種情況中的一種。如果我們選擇了第i個物品,那麼實際上這個最優解是c[i - 1, w-wi] + vi。而如果我們沒有選擇第i個物品,這個最優解是c[i-1, w]。這樣,實際上對於到底要不要取第i個物品,我們只要比較這兩種情況,哪個的結果值更大不就是最優的麼?

在前面討論的關係裡,還有乙個情況我們需要考慮的就是,我們這個最優解是基於選擇物品i時總重量還是在w範圍內的,如果超出了呢?我們肯定不能選擇它,這就和c[i-1, w]一樣。

另外,對於初始的情況呢?很明顯c[0, w]裡不管w是多少,肯定為0。因為它表示我們乙個物品都不選擇的情況。c[i, 0]也一樣,當我們總重量限制為0時,肯定價值為0。

這樣,基於我們前面討論的這3個部分,我們可以得到乙個如下的遞推公式:

c[i,w]=0 , i=0 or w=0

c[i,w]=c[i-1,w] , wi>w

c[i,w]= max(c[i-1,w], vi+c[i-1,w-wi]) ,i>0 and w>=wi

注意:

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

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

**實現:

#include 

#include

using

namespace

std;

const

int n=5;

const

int w=10;

int c[n+1][w+1];

int dynamicprogramming();

int main()

int dynamicprogramming()

; //商品的質量陣列

int v[5]=; //商品對應的價值陣列

int i,j;

for(i=0;i<=n;i++)

for(j=0;j<=w;j++)

;for(i=1;i<=n;i++)

for(j=w[0];j<=w;j++)

;for(i=0;i1;i++)

cout

}

【部分揹包】問題描述:

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

解決方案:

考慮使用貪心演算法求解

**實現:

#include

using

namespace

std;

void greedypackage(int w,float *m,float *v);

int main()

; float v[7]=;

greedypackage(w,m,v);

return0;}

void greedypackage(int w,float *m,float *v)

; //儲存物品的單位價值

int c[7]=; //用於跟蹤物品單位價值對應的物品號

for(int i=0;i<7;i++)

;cout

<<"共有7件商品,每件商品的質量分別為:"

01揹包與部分揹包

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

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

0 1揹包 問題描述 n件物品,第i件物品價值 v i 元,重w i 磅。希望用 w磅的書包 拿走總價值最貴的物品。物品不可以分割故稱為0 1揹包 部分揹包 問題描述 n件物品,第i件物品價值 vi 元,重wi 磅。希望用 w磅的揹包 拿走最重的物品。第i件物品可以都拿走,也可以拿走一部分。物品可以...

揹包 01揹包

01揹包 有n種物品與承重為m的揹包。每種物品只有一件,每個物品都有對應的重量weight i 與價值value i 求解如何裝包使得價值最大。dp i,v 表示前i個物體 包括第i個 面對容量為v的揹包的最大價值,c i 代表物體i的重量,w i 代表物體i的價值 如果第i個物體不放入揹包,則揹包...