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