描述
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行,每行包含乙個整數,表示詢問的答案。
3
3 5
2 2
1 2
3
3 1
3 2
3 3
4
5
5
有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件,那麼討論分兩個角度...