揹包問題拓展(字首揹包字尾揹包)

2021-08-28 20:00:12 字數 2610 閱讀 5363

描述

n個物品,每個物品有乙個體積v和價值w。現在你要回答,把乙個物品丟棄後,剩下的物品裝進乙個大小為v的揹包裡能得到的最大價值是多少。

輸入的第一行包含乙個正整數n(n ≤ 5000)。

接下來n行,每行包含兩個正整數v和w(v,w ≤ 5000),分別表示乙個物品的體積和價值。

接下來一行包含乙個正整數q(q ≤ 5000),表示詢問個數。

接下來q行,每行包含兩個正整數v和x(v ≤ 5000,x ≤ n),表示詢問將物品x丟棄以後剩下的物品裝進乙個大小為v的揹包能得到的最大價值。

輸出q行,每行包含乙個整數,表示詢問的答案。

33 52 21 23

3 1

3 2

3 3

455有3個物品,第乙個物品的體積為3、價值為5,第二個物品體積為2、價值為2,第三個物品體積為1、價值為2。

有3個詢問:

第乙個詢問是問去掉1物品後剩下的2、3物品填進乙個大小為3的揹包能得到的最大價值。顯然2、3物品都是可以放進揹包的,所以最大價值為2+2=4。

第二個詢問是問去掉2物品後剩下的1、3物品填進乙個大小為3的揹包能得到的最大價值。若我們填3物品,我們只能得到價值2;若我們填1物品,則可以得到價值5。所以最大價值為5。

第三個詢問我們同樣也是填1物品,最大價值為5。

在這裡,我假設大家已經了解過經典的揹包問題,假設大家知道揹包問題的打表

我們知道經典的揹包問題,就是打一張二維陣列表,從表中取最大值(也就是右下角的一位)

就像上圖所示

而今天的問題棘手的地方來自如果去掉乙個物品,比如去掉物品3.就會毀掉整個表的正確性,因為後面項很多都是以其為基礎。

我們觀察下圖,去掉物品3,顯然3前面的項的正確性依然保持,壞掉的只是3後面項的正確性。

我們將3前面的項表稱作3的字首揹包

將3後面的項表稱作3的字尾揹包

3的字尾揹包的項是錯誤的,因為它以3作為了基礎,而現在我們已經要去掉3了,因此3的字尾揹包需要重新求解。

求解結束後,我們對於3有了它正確的字首揹包,也有了它正確的字尾揹包。

怎麼融合它的字首揹包和字尾揹包成了新的問題。因為計算字首揹包和字尾揹包的時候,我們將其承重量都簡單地考慮成總揹包的

承重量,而實際上,兩個揹包加起來才是總揹包的承重量。於是,在融合字首揹包和字尾揹包時,我們要看看,字首揹包和字尾背

包各分配多少承重才能達到最大效益。

#include #include using namespace std;

int d[5004][5004];//字首揹包

int f[5004][5004];//字尾揹包

// ***************== **實現開始 ***************==

/* 請在這裡定義你需要的全域性變數 */

// n個物品,每個物品有體積價值,求若扔掉乙個物品後裝進給定容量的揹包的最大價值

// n:如題

// w:長度為n+1的陣列,w[i]表示第i個物品的價值(下標從1開始,下標0是乙個數字-1,下面同理)

// v:長度為n+1的陣列,v[i]表示第i個物品的體積

// q:如題

// qv:長度為q+1的陣列,qv[i]表示第i次詢問所給出的揹包體積

// qx:長度為q+1的陣列,qx[i]表示第i次詢問所給出的物品編號

// 返回值:返回乙個長度為q的陣列,依次代表相應詢問的答案

vectorgetanswer(int n, vectorw, vectorv, int q, vectorqv, vectorqx)

//字尾揹包計算

for(int i = n; i>0; i--)

vectorans;

for(int i=1; i<=q; i++)

ans.push_back(qus);

}return ans;

}// ***************== **實現結束 ***************==

int main()

scanf("%d", &q);

for (int i = 0; i < q; ++i)

vectorans = getanswer(n, w, v, q, qv, qx);

for (int i = 0; i < q; ++i)

printf("%d\n", ans[i]);

return 0;

}

揹包問題 01揹包 完全揹包 多重揹包

01揹包和完全揹包的區別 01揹包的侷限在於每樣物品只有一種,每個物品都有乙個屬於自己的價值和重量,在給定的物品中選出揹包所能容納的最大重量,要求是價值最大 完全揹包與01揹包的不同在於完全揹包不限制每樣物品的個數,物品的價值和質量都與01揹包一樣,也同樣是求在給定大小的容量中,找出最大價值的選擇 ...

揹包問題(01揹包,完全揹包,多重揹包)

揹包問題 01揹包,完全揹包,多重揹包 近日為以下瑣事煩身 差不多要向學院提交專案申請了,本來是想做個多模式的im系統的,可是跟往屆通過審核的專案比起來,缺乏創新和研究價值,所以在文件上要多做手腳,花點心思。揹包問題,經典有揹包九講。不死族的巫妖王發工資拉,死亡騎士拿到一張n元的鈔票 記住,只有一張...

揹包問題 01揹包,完全揹包,多重揹包

有goods num件物品,max volume的最大裝載量,每種物品只有一件,每種物品都有對應的重量或者說體積volume i 價值value i 求解裝包的最大價值 假設目前已經有 i 1件物品裝在容量為 j 的揹包中,並且得到最大價值package i 1 j 當前裝第i件,那麼討論分兩個角度...