問題描述、
問題描述:給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為c。問:應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?
問題分析:先將n件物品順序排列,依次裝入揹包,每裝入一件即檢查當時揹包物品體積是否超過c,若裝入該物品後不超過揹包容量c,則裝入,否則棄之取下乙個,當揹包中無法裝入新物品時,記錄揹包中物品總價值為v, 若當前揹包中物品總價值v為最大值,則將當前物品組合記錄,並取出最後裝入的物品,繼續裝入其他未裝入的物品,如此重複直到所有組合嘗試過,輸出使總價值v最大的物品組合。
輸入樣例: 物品體積分別為;價值分別為
輸出樣例: 最大價值為10,其組合為體積為7價值為7的第2件物品和體積為3價值為3的第1件物品
設計思路
設計思路:設一維陣列w[1:n]用來存放n件物品的體積,一維陣列vi[1:n]用來存放n件物品價值,一維陣列v[1:n]用來存放當前為止放入揹包物品價值最大組合的序號,一維陣列s[1:n]用來存放放入揹包內的物品的序號,c為揹包能容納的體積,v為揹包內物品總價值,vmax為當前為止物品組合最大價值。i為待選物品序號。每進棧一件物品,就從c中減去該物品的體積,若c-w[i]>=0,則該物品可選,若c-w[i]<0,則該物品不可選,此時物品組合總價值與vmax比較,若大於vmax,則替換vmax及v[1:n],若i>n,則需退棧,若此時棧空,則結束執行並輸出此時vmax和v[1:n]。
資料結構:w[1:n]:存放n件物品的體積。
vi[1:n]用來存放n件物品價值.
vm[1:n]存放當前為止價值最大物品組合序號。
s[1:n]:存放放入揹包內物品序號。
c:揹包能容納的體積。
v:揹包內物品總價值。
vmax:當前為止物品組合最大價值。
i:待選物品序號。
演算法描述:
pack(c, n, w, s, vi, vm, v, vmax, top)
top<-0; i<-1
while(c>0) and (i<=n) do
if (c-w[i]=0) or (c-w[i])>=0) and (i
if (v>vmax) then
else
i<-i+1//準備挑選下一件物品//
end ( while )
output(vmax, vm[1:n]) return
測試用例及結果說明
揹包容量:c=10;
物品質量:w[6]=;
物品價值:vi[6]=;
測試結果: 最大價值為10,其組合為體積為7價值為7的第2件物品和體積為3價值為3的第1件物品
設計及測試過程
第一步:提出問題;
第二步:問題轉換;
第三步:演算法構思;
第四步:偽碼描述;
第五步:**編寫;
第六步:**測試;
第七步:**修正;
遇到問題及解決方法:
評價和改進
演算法優點:能夠準確找出能夠裝的最大物品價值組合並輸出
演算法缺點:如果多組物品最大價值相同,只能輸出第一組物品
功能拓展:可以再建立乙個儲存空間存放所有能夠構成最大價值的物品組合
功能應用:可以方便人們解決一些資料量巨大的最優解問題
#include #define n 14
using namespace std;
int main()
else
}i++;
} cout<<"揹包所能容納最大物品價值為 "
system("pause");
return 0;
}
揹包價值最大問題
實驗題目 給定n種物品和乙個揹包.物品i的重量是wi,其價值為vi,揹包的容量為c.在選擇物品i裝入揹包時,可以選擇物品i的一部分,1 i n.問應如何選擇裝入揹包中的物品,使得裝入揹包中物品的總價值最大 需求 分析 本演示程式用vs編寫。1 輸入的形式和輸入值的範圍 1 i n.2 輸出的形式 直...
不考慮價值的揹包問題
揹包問題 假設有乙個能裝入總體積為t的揹包和n件體積分別為w1,w2,wn的物品,能否從n件物品中挑選若干件恰好裝滿揹包,使w i1 w i2 w in t,要求找出所有滿足上述條件的解。include include include using namespace std struct item ...
C 揹包問題
在0 1揹包中,物體或者被裝入揹包,或者不被裝入揹包,只有兩種選擇 迴圈變數i,j的意義 前i個物品能夠裝入載重量為j的揹包中 陣列value的意義 value i j 表示前i個物品能加載重量為j的揹包中的最大價值 若w i j,第i個物品不被裝入揹包,否則,第i個物品放入揹包後的最大價值 val...