C 揹包最大可容價值問題

2021-08-28 17:06:04 字數 1819 閱讀 3858

問題描述、

問題描述:給定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...