Luogu P1858 多人揹包

2022-04-08 02:08:22 字數 940 閱讀 2976

gate

求01揹包前k優解的價值和(題面還挺親切的)

本來我想的是直接邊跑01揹包邊記錄,最後排序...

然後意識到,這種方法是列舉不全的。

看了眼題解...要多開一維!

k的範圍很小,f[i][j]表示空間為i,是第j優解。

那麼,因為有許多j,所以對於每個不一樣的j,

f[i][j]既可能從f[i-c][...]+w轉移過來,也可能從f[i][...]轉移過來。

用類似於歸併排序的方法:

維護兩個指標t1,t2;

同時為了防止新的f覆蓋原來的影響後續的狀態轉移,

用乙個臨時的g記錄,最後再轉移過去。

那麼就有g[t] = max(f

[j-c][t1++]+w,

f[j][t2++])

最後答案統計f[m][1-k]就可以了。

**如下

#include#include

#include

#include

#define mogeko qwq

#define darcy amour

using

namespace

std;

const

int maxn = 1e5+10

;const

int inf = 0x3f3f3f3f

;int k,m,n,c,w,ans,f[maxn][60],g[60

];int

main()

for(int t = 1; t <= k; t++)

f[j][t] =g[t];}}

for(int i = 1; i <= k; i++)

ans +=f[m][i];

printf("%d

",ans);

return0;

}

view code

luoguP1858 多人揹包

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

Luogu P1858 多人揹包

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 200 讓我先秒了這道水題。...

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