背包问题

背包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)\)

posted @ 2024-11-11 10:56  Zhone_lb  阅读(8)  评论(0)    收藏  举报