問題描述
dd 和好朋友們要去爬山啦!他們一共有 k 個人,每個人都會背乙個包。這些包的容量是相同的,都是 v。可以裝進揹包裡的一共有 n 種物品,每種物品都有給定的體積和價值。
在 dd 看來,合理的揹包安排方案是這樣的:
每個人揹包裡裝的物品的總體積恰等於包的容量。
每個包裡的每種物品最多只有一件,但兩個不同的包中可以存在相同的物品。
任意兩個人,他們包裡的物品清單不能完全相同。
在滿足以上要求的前提下,所有包裡的所有物品的總價值最大是多少呢?
輸入格式
第一行有三個整數:k、v、n。
第二行開始的 n 行,每行有兩個整數,分別代表這件物品的體積和價值。
輸出格式
只需輸出乙個整數,即在滿足以上要求的前提下所有物品的總價值的最大值。
樣例輸入
2 10 5
3 12
7 20
2 45 6
1 1
樣例輸出
57
提示
k<=50
v<=5000
此題相當於求最大k優解,需要求出前k大的解。只需要像k短路一樣將f陣列開成二維,記錄下每乙個揹包狀態下的前k大解即可。具體來講 用f
[i][
k]表示容積為i時的第k大解,於是轉移的時候有f[
i][1
−k] 和f[
i−w]
[1−k
]+v 總共2k個值,取前k個作為f[
i][k
] 即可,注意到f[
i][1
−k] 和f[
i−w]
[1−k
]+v 都是有序的,所以可以歸併處理。
#include
#include
#include
using namespace std;
int t,v,n,v[233],w[233],f[5555][55],x[55],y[55],ans;
int main()
for(k=p1=p2=1;k<=t;k++)
if(x[p1]>y[p2])f[j][k]=x[p1++];
else f[j][k]=y[p2++];
}for(i=1;i<=t;i++)ans+=f[v][i];
cout<}
揹包 DP 揹包
揹包 題目 是dp中較為常見的題目 分為 0 1 揹包 完全揹包 和多重揹包 這三類 是越來越深入的首先來介紹一下 0 1揹包 首先 0 1 揹包的含義是 給你乙個容量位m的揹包 然後給你n個物品 每個物品具有一定價值和一定重量 會站一定的揹包空間 答案是在n個物品中那幾個 然後使得到的價值最大 首...
揹包dp之01揹包
現在我們有n個配件,他們有不同的價值.但是我們揹包的容量是有限的,因為我們只有乙個一級包,所以我們最多可以裝v重量的東西.但是為了能更好的吃到雞 不存在的 我們要攜帶更有價值的配件,請問我們最多能拿多少價值的配件來當快遞員呢?輸入的第一行是t,表示有一共要打t場比賽.每組資料由三行組成.第一行包含兩...
dp 揹包之多重揹包
問題 多重揹包也是 0 1 揹包的乙個變式。與 0 1 揹包的區別在於每種物品有ki個,而非乙個。解決方案 將k個相同的物品,看作k個不同的物品,但是wi,ci都一樣。即可套用 01揹包方案 詳見 優化方法 二進位制優化 設k個物品分成 a xx a xx 1 a xx k 1 個物品。那麼 a x...