★問題描述:給定m個物品和一揹包。物品i的重量是wei[i],其價值是val[i],揹包容量是n。問應如何選擇裝入揹包中的物品,使得裝入揹包中物品的總價值最大。
★演算法設計:利用動態規劃演算法,要考慮到每種物品有兩種選擇,即裝入揹包或者不裝入揹包。不能將同一物品裝入揹包多次,也不能只裝入物品的一部分。
★資料輸入:輸入乙個n作為揹包容量,輸入乙個m作為物品的數量。接下來輸入m個數作為m個物品的重量,再輸入m個數作為物品的價值
★資料輸出:輸出揹包中物品的最大總價值。
例:輸入:
2 2 6 5 4
6 3 5 4 6
輸出:首先來考慮如何想這個問題。m個物品,每個物品兩種狀態,裝在包裡或者沒有裝在包裡。那比較容易想到的方法就是窮舉法,然後找到小於揹包總容量的最大的方式。但是這個方法時間複雜度太高,比如5個揹包就有2的5次方種放的方法,而且時間複雜度是指數級的,所以開始想簡便的方法。
可以看一下這個表
最後一行是作為輔助行來幫助進行迴圈的。
圖需要從左到右,從下到上來看:
比如第6行就是只有包裹e的時候,隨著揹包容量增大,揹包最大總價值的變化
第5行就是有揹包d和e時,揹包總價值的變化
以此類推……
第2行就是有所有物品的時候,揹包最大總價值的變化,而m2就是我們要求的結果
這個**是咋來的:
首先,第7行預設全是0,作為輔助行
之後每一行都需要參考前一行來進行賦值(第6行要靠第7行來賦值)
先要做乙個判斷,列數是不是大於本行揹包的重量,如果小於,直接賦前一行對應列的值(比如d6,e6,f6)
如果大於等於本行的物品重量,就要進行乙個判斷:a[i][j]=max(a[i+1][j],a[i+1][j-wei[i]])
比如說要確定l4,就要看l5和f5+5誰更大,結果是l5更大
比如說要確定k2,就要看k3和i3+6誰更大,結果是i3+6更大
下面是c++的**:
#include using namespace std;
int main()
; int wei[10]=;//揹包重量
int val[10]=;//揹包價值
int n,m,i,j;
cout<
cin>>n;//揹包容量
cout<
cin>>m;
cout
cout
//開始填** 最下面增加一排0
for(i=m-1;i>=0;i--)//i為行數
for(j=0;j<=n;j++)
else a[i][j]=a[i+1][j];
//如果重量比本排的包裹小,直接賦值前一排的value
}//開始列印**
cout<
演算法(揹包問題 01揹包問題)
01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...
演算法 揹包問題
揹包問題用逆序減少空間複雜度的情況下,揹包問題,如果是多維揹包 質量,容積,個數 則加矩陣維度 如果是01揹包,則逆序內迴圈,如果是完全揹包 每種物品個數不限 則順序內迴圈,如果是混合揹包 限制每種物品的個數 include using namespace std define maxn 110 d...
演算法 揹包問題
什麼是揹包問題呢?就是乙個特定載重的揹包,給你乙個資料表,求解其最優的結果,那麼很顯然嘍 這就是乙個優化問題 那麼我們具體一點!這個揹包載重8千克 李子 4kg 4500元 蘋果 5kg 5700元 士多啤梨 1kg 1100元 橘子 2kg 2250元 甜瓜 6kg 6700元 那,我們使用動態規...