動態規劃中的0 1揹包問題

2021-09-25 16:28:07 字數 1397 閱讀 2085

輸入資料

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的情況下,最...