求01揹包前k優解的價值和
輸入格式:
第一行三個數k、v、n
接下來每行兩個數,表示體積和價值
輸出格式:
前k優解的價值和
輸入樣例#1:
2 10 53 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...