背包问题
背包k优解
类似次短路算法,记录前\(k\)优解,转移即可
由于一个状态只会有\(2\)个来源(\(j,j-w[i]\)),问题变成了两个单调序列的前\(k\)大问题,直接不断取队头比较即可
时间复杂度\(O(nkV)\),我是直接暴力排序+卡常过的(别用\(STL\),好慢)
练习
#6089. 小 Y 的背包计数问题
很妙的思路
考虑根号分治,分为 \(i\le\sqrt n\)和 \(i>\sqrt n\) 两部分,易发现分别为多重背包和完全背包
第一部分,直接多重背包单调队列优化即可,时间复杂度\(O(n\sqrt n)\)
第二部分,发现背包至多放\(\sqrt n\)个物品,那么设\(f[i][j]\)为考虑 \(i\in[1,\sqrt n]\)个数,每个数的值域为\([\sqrt n,n]\),和为\(j\)的方案数
考虑转移,由于不考虑顺序,把这些数升序排序,那么可以通过在开头加一个\(\sqrt n+1\)或整体加\(1\)来转移(类似于球盒模型中加盒子/整体放一个球)
总体时间复杂度\(O(n\sqrt n)\)

浙公网安备 33010602011771号