luoguP1858 多人揹包

2021-08-10 09:22:29 字數 975 閱讀 4920

題目鏈結

分析:

首先要宣告,題目有一些描述不準確的地方:

這是一道01揹包k優解的問題

唯一的不同就是:揹包必須裝滿

實際上這個問題也非常好解決:

如果我們不要求裝滿,取的是最大值,那麼f的初始值就是0

如果要求裝滿,那麼f的初始值就是-inf,其中f[0]=0

怎麼理解呢:

初始化的f陣列實際上就是在沒有任何物品可以放入揹包時的合法狀態。

如果要求揹包恰好裝滿,那麼此時只有容量為0的揹包可能被價值為0的nothing「恰好裝滿」

其它容量的揹包均沒有合法的解,屬於未定義的狀態,它們的值就都應該是-∞了。

如果揹包並非必須被裝滿,那麼任何容量的揹包都有乙個合法解「什麼都不裝」

這個解的價值為0,所以初始時狀態的值也就全部為 0了

//這裡寫**片

#include

#include

#include

using

namespace

std;

int f[5005][55],a[55],b[55];

int w[203],v[203];

int n,m,k;

int main()

a[k+1]=b[k+1]=-1;

int x,y,z;

x=y=z=1;

while (z<=k&&(a[x]!=-1||b[y]!=-1))}}

int ans=0;

for (int i=1;i<=k;i++) ans+=f[m][i];

printf("%d\n",ans);

return

0;}

Luogu P1858 多人揹包

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

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