揹包問題系列演算法詳解

2021-05-02 03:40:26 字數 2397 閱讀 3185

揹包問題是乙個關於最優解的經典問題。通常被討論的最多的,最經典的揹包問題是0-1揹包問題(0-1 knapsack problem)。它是一切揹包問題及相關揹包問題的基礎。本篇博文將詳細分析0-1揹包問題,並給出0-1揹包問題的幾種解法,同時也對0-1揹包問題的內涵進行延伸,豐富其外延至完全揹包問題和多重揹包問題,並給出揹包問題的演算法實現過程,希望對大家有幫助。

一、0-1揹包問題

有n件物品和乙個容量為v的揹包。第i件物品(每個物品只有一件)的費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使價值總和最大。

(1)遞迴求解

演算法如下:

#include "iostream"

#define capacity 10

#define goodsnum 6

using namespace std;

int nvol[goodsnum];

int nvalue[goodsnum];

int knapsack(int itemindex,int vol);

void main()

cout<<"the max value is: "else if (vol>=nvol[itemindex] && knapsack(itemindex-1,vol)分析:遞迴求解,求解過程中的絕大部分變數存在重複求解的過程,演算法的效率較低,有待改進;那怎麼改進呢?最有效的是用陣列儲存每次計算的結果,不用重複計算,於是有二維陣列求解。

(2)二維陣列求解

演算法如下:

#include "iostream"

#define capacity 10

#define goodsnum 6

using namespace std;

void main()

;int c[goodsnum] = ;

int fun[goodsnum+1][capacity+1];

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

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

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

;int nvalue[goodsnum] = ;

int selecttable[goodsnum][capacity+1] = ;

int nknapsack[capacity+1] = ;//most important for the first compution below

int itemindex,capindex;

for (itemindex=0;itemindex=nvolume[itemindex];capindex--)//notice that capindex>=nvolume[itemindex],not capindex>=0  注意此處與二維陣列求解的區別

稍加分析可得完全揹包問題的狀態方程f[i][v]=max,因而有以下演算法實現過程,並最終給出了所選擇的物品和選擇該物品的數目。

實現演算法:

#include "iostream"

#define capacity 10

#define goodsnum 6

using namespace std;

void main()

;int nvalue[goodsnum] = ;

int selecttable[goodsnum][capacity+1] = ;

int nknapsack[capacity+1] = ;//most important for the first compution below

int itemindex,capindex;

for (itemindex=0;itemindex=nvolume[itemindex];capindex--)//notice that capindex>=nvolume[itemindex],not capindex>=0

{num = 0;

max = nknapsack[capindex];

for (k=1;k<=capacity/nvolume[itemindex];k++)

{if (capindex>=k*nvolume[itemindex] && max=0;itemindex--)

{if (selecttable[itemindex][capindex])

{cout《三、多重揹包問題

多重揹包問題:有n種物品和乙個容量為v的揹包。第i種物品最多有n[i]件可用,每件費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

多重揹包問題基本求解方式同完全揹包問題,唯一的是控制引數k的限制有所不同。只需要將完全揹包問題實現中的k<=capacity/nvolume[itemindex]限制條件改為k<=capacity/nvolume[itemindex] && k<= n[i]即可。

(全文完)

揹包問題系列詳解

揹包問題是乙個關於最優解的經典問題。通常被討論的最多的,最經典的揹包問題是0 1揹包問題 0 1 knapsack problem 它是一切揹包問題及相關揹包問題的基礎。本篇博文將詳細分析0 1揹包問題,並給出0 1揹包問題的幾種解法,同時也對0 1揹包問題的內涵進行延伸,豐富其外延至完全揹包問題和...

揹包問題詳解

問題描述 有n件物品和乙個容量為v的揹包。第i件物品的重量是w i 價值是p i 求解將哪些物品裝入揹包可使這些物品的總重量不超過揹包容量,且價值總和最大。思路 每種物品僅有一件,可以選擇放或不放。f i,v 表示前i件物品放入乙個容量為v的揹包可以獲得的最大價值。狀態轉移方程為 f i,v max...

揹包問題詳解

nyoj289蘋果 01揹包 時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 ctest有n個蘋果,要將它放入容量為v的揹包。給出第i個蘋果的大小和價錢,求出能放入揹包的蘋果的總價錢最大值。輸入 有多組測試資料,每組測試資料第一行為2個正整數,分別代表蘋果的個數n和揹包的容量...