NKOJ 1314 爬山(揹包dp)

2021-08-07 14:07:12 字數 1382 閱讀 9220

問題描述

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...