揹包問題是乙個關於最優解的經典問題。通常被討論的最多的,最經典的揹包問題是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和揹包的容量...