輸入資料
t表示有t組資料
然後分別輸入t組
第一行為物品個數n,揹包容量v
第二行為物品價值
第三行為物品占用體積
輸出最大價值量
input
15 10
1 2 3 4 5
5 4 3 2 1
output
14首先考慮動態規劃
將物品個數和揹包容量想象為二維陣列,行用i表示面臨的第i個物品的選擇,列用j表示揹包容量為j的情況下最優的裝載價值。
然後我們開始模擬從第乙個物品開始挑選的過程,用兩個for迴圈來模擬這個過程:
for(int i=1;i<=n;i++)
}
模擬一下過程哈
首先挑選第乙個物品,價值1,體積5,在第乙個for迴圈中進行第二個對揹包的體積進行的for迴圈,體積小於5之前的價值s[i][j]肯定都是0不用多講,從體積大於等於5開始,揹包能裝入的價值量為1了,第1行後面都一樣,接著我們來看第2行。
第二行是第乙個for迴圈迴圈到i=2的情況,開始挑選第二個物品,還是從體積為1開始迴圈,直到體積為4可以裝第二個物品了,所以s[2][4]=2了,然後關鍵的地方來了,到體積為5的時候,5>4,所以s[2][5]=s[2-1][5]或者s[2-1][5-物品2的體積]+物品2的價值(也就是s[i-1][j-w[i]]+v[i]),在這裡當揹包容量大於等於這個挑選的物品時,可以分為兩種情況:①不選就等於s[i-1][j]②選則等於s[i-1][j-w[i]]+v[i],這個的意思就是在選第i個物品時,前i-1個物品挑選過的最大價值加上第i個物品的價值(這個時候揹包剩餘體積需要減去裝入第i個物品的體積)。
下面我們來改進**,如果資料非常大,我們建立二維陣列就會出現**記憶體太大的錯誤,我們根據這道題完全可以轉換為乙個一維陣列:但是注意,揹包容量的那個for迴圈只能是從後向前,因為我們必須保證前面的資料對後面的資料不會產生影響。
for(int i=1;i<=n;i++)
for(int j=v;j>0;j--)
完整**:
#include#includeusing namespace std;
#define max_n 1000
#define max(a,b) a>b?a:b
int s[1007];
int main()
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
for(int j=v;j>0;j--)
cout<}
}
動態規劃揹包問題 01揹包
問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...
動態規劃 揹包問題 01揹包
有n種物品和乙個容量為v的揹包,每種物品僅用一次。第i件物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使價值總和最大。例如 n 5,v 10 重量 價值 第乙個物品 10 5 第二個物品 1 4 第三個物品 2 3 第四個物品 3 2 第五個物品 4 1 首先我們考慮貪心策略,選取最大價...
0 1揹包問題(動態規劃)
一 問題描述 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。所謂01揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。二 解決方案 考慮使用動態規劃求解,定義乙個遞迴式 opt i v 表示前i個物品,在揹包容量大小為v的情況下,最...