P1858 多人揹包

2022-03-04 07:37:45 字數 1085 閱讀 5616

求01揹包前k優解的價值和

輸入格式:

第一行三個數k、v、n

接下來每行兩個數,表示體積和價值

輸出格式:

前k優解的價值和

輸入樣例#1:

2 10 5

3 12

7 20

2 45 6

1 1

輸出樣例#1:

57

對於100%的資料,

k≤50,v≤5000,n≤200

solution:

本題由於需要求前$k$個最優解的和。

那麼我們在普通的$0/1$揹包狀態上再加一維,設$f[i][j]$表示裝了$i$容量時第$j$大的解,初始化$-inf$,初狀態$f[0][1]=0$表示容量為$0$時最大的解為$0$。

在列舉狀態時,記錄下當前決策轉移後的前$k$大的解,並用其更新$f$,採用歸併排序的思路去維護就$ok$啦。

(這個講不清白,需結合**自行思考理解!)

**:

#include#define for(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)

#define bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)

#define max(a,b) ((a)>(b)?(a):(b))

using

namespace

std;

const

int n=5005

;int n,k,m,w[205],v[205],f[n][55

],ans;

intmain()

for(p,

1,k)f[j][p]=c[p];

}for(i,

1,k)ans+=f[m][i];

cout

}

P1858 多人揹包

01揹包的前 k 優解 我們先考慮一下最平凡的01揹包問題是如何進行求解的,一維狀態下 f j max f j f j w i v i 有第k優解的限制怎麼辦,不妨加乙個維度,把動態規劃的轉移想象成圖中點與點之間 的移動 f j k 表示裝滿體積為 j 的揹包的第 k 優解 我們發現,最優解的數值是...

洛谷P1858 多人揹包

題目鏈結 dd 和好朋友們要去爬山啦!他們一共有 k 個人,每個人都會背乙個包。這些包的容量是相同的,都是 v 可以裝進揹包裡的一共有 n 種物品,每種物品都有給定的體積和價值。在 dd 看來,合理的揹包安排方案是這樣的 每個人揹包裡裝的物品的總體積恰等於包的容量。每個包裡的每種物品最多只有一件,但...

洛谷 P1858 多人揹包 DP

目錄輸入輸出樣例 說明思路 ac 洛谷 p1858 多人揹包 求01揹包前k優解的價值和 第一行三個數 k,v,n 接下來每行兩個數,表示體積和價值 前 k 優解的價值和 2 10 5 3 12 7 20 2 45 6 1 157對於100 的資料,k leq 50,v leq 5000,n leq...