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