Luogu P1858 多人揹包

2022-05-20 02:35:03 字數 847 閱讀 5546

p1858 多人揹包

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

第一行三個數\(k\)、\(v\)、\(n\)

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

前\(k\)優解的價值和

2 10 5

3 12

7 20

2 45 6

1 1

57
對於\(100\%\)的資料,\(k\leq 50,v\leq 5000,n\leq 200\)

讓我先秒了這道水題。 --mercury

多重揹包。考場上考到的時候使用的是\(stl\)中的優先佇列求解,即對於每乙個\(v\)狀態開乙個優先佇列,更新時逐個取出再插入,超過\(50\)個時後面的不用再插回去了。

這是一種顯然的蚊子打高射炮高射炮打蚊子的做法,我們不妨這麼想:

對於一般的\(01\)揹包問題,我們有標準的狀態轉移方程\(f[i]=max(f[i],f[i-v[j]]+w[j])(i\geq v[j])\)。也就是說,對於每個物品而言,狀態\(f[i]\)只與\(f[i]\)和\(f[i-v[j]]\)有關,所以我們不妨設計\(f[i][j]\)表示\(f[i]\)的第\(j\)優解,更新時因為\(f[i][j]\)是有單調性的,所以拿單調指標從左往右掃一遍,掃出\(k\)個最優解,來更新就好了:

for(int i=v;i>=v[j];i--)//01揹包倒序列舉

int main()

}for(int i=0;iprintf("%d",ans);

return 0;

}

luoguP1858 多人揹包

題目鏈結 分析 首先要宣告,題目有一些描述不準確的地方 這是一道01揹包k優解的問題 唯一的不同就是 揹包必須裝滿 實際上這個問題也非常好解決 如果我們不要求裝滿,取的是最大值,那麼f的初始值就是0 如果要求裝滿,那麼f的初始值就是 inf,其中f 0 0 怎麼理解呢 初始化的f陣列實際上就是在沒有...

Luogu P1858 多人揹包

gate 求01揹包前k優解的價值和 題面還挺親切的 本來我想的是直接邊跑01揹包邊記錄,最後排序.然後意識到,這種方法是列舉不全的。看了眼題解.要多開一維!k的範圍很小,f i j 表示空間為i,是第j優解。那麼,因為有許多j,所以對於每個不一樣的j,f i j 既可能從f i c w轉移過來,也...

P1858 多人揹包

求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 本題由於需要...