揹包問題系列詳解

2021-06-16 23:42:08 字數 1146 閱讀 3656

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

一、0-1揹包問題

有n件物品和乙個容量為v的揹包。第i件物品(每個物品只有一件)的費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使價值總和最大。在選擇裝入揹包的物品時,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能將物品i裝入揹包多次,也不能只裝入部分的物品。因此,該問題稱為0-1揹包問題。

(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: "<=nvol[itemindex] && knapsack(itemindex-1,vol)=nvolume[itemindex];capindex--)//notice that capindex>=nvolume[itemindex],not capindex>=0 注意此處與二維陣列求解的區別

}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和揹包的容量...