$dfs$ + 堆,求第 $k$ 优解.
首先去求第 $k$ 小的子集权值 $val$ ,先将元素权值从小到大排序.
每个子集可以用一个二元组 $(i,j)$ 表示权值为 $i$ ,最大的元素编号为 $j$ .
将它加入优先队列,一个二元组 $(i,j)$ 可以得到 $(i-a_j+a_{j+1},j+1)$ 与 $(i+a_{j+1},j+1)$ .
前者表示不选 $j$ 了,后者表示保留 $j$ .第 $k$ 次取出二元组时对应的权值就是第 $k$ 小的子集权值.
然后要求第 $k$ 小的具体方案,直接 $dfs$ 爆搜,但要保证权值不超过 $val$ .
每次找后面第一个数,使得加入后权值仍不超过 $val$ ,用线段树来找这个数,第 $k$ 次时集合中的数就是答案.
注意除掉空集的贡献.
1 |
|