想了个做法:假设每种物品有 k 个,然后像处理背包一样进行二进制分组,排序,就转化为子集第 k 大。然后用 priority_queue 维护二元组 (sum,i),表示和为 sum 且选取的最后一个元素是第 i 个,这样每次取出堆顶元素,插入 (sum−ai+ai+1,i+1) 和 (sum+ai+1,i+1),可以证明这样会遍历所有子集,取出顺序是单调不降的。这样,取出第 k 个的时候(用一个变量 cnt 记录)的 sum 就是答案。
现在有个问题,题目要求是严格第 k 大,我这个做法只能保证非严格时的复杂度,发现堆顶 sum 是非严格的时候 cnt 不加 1,然后会 TLE。
有什么改进方案吗?