題目鏈結
分析:
首先要宣告,題目有一些描述不準確的地方:
這是一道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 本題由於需要...