P1858 多人揹包

2022-03-14 08:02:28 字數 924 閱讀 6066

01揹包的前\(k\)優解

我們先考慮一下最平凡的01揹包問題是如何進行求解的,一維狀態下

\(f[j]=max(f[j],f[j-w[i]]+v[i])\)

有第k優解的限制怎麼辦,不妨加乙個維度,把動態規劃的轉移想象成圖中點與點之間

的移動\(f[j][k]\)表示裝滿體積為\(j\)的揹包的第\(k\)優解

我們發現,最優解的數值是隨著\(k\)增大而減小的,滿足單調性

很容易發現,我們需要記錄用其他物品來填充揹包是否能得到更優解.

因此我們需要記錄乙個變數c1表示體積為j的時候的第c1優解能否被更新.

再去記錄乙個變數c2表示體積為j-v[i]的時候的第c2優解.

這樣也就回到了01揹包的最基本的情況,選還是不選

顯然對於體積為\(j\)的情況,它的前\(k\)優解可以由以上兩種情況轉移過來

那麼我們可以在轉移的時候記錄乙個中間陣列,\(now\)

所以有以下的**

int cnt = 0;//對於每個j,我們都需要清空一下now陣列

int c1 = 1;//情況1的最優解

int c2 = 1;//情況2的最優解

while (cnt <= k)

}for (int z = 1; z <= k; z++)

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

}for (int z = 1; z <= k; z++)

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

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

return 0;

}

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

洛谷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...