editorial - subset sum

subset sum 题解

Subtask 1

因为 \(c\le 5000\),输出 \(c\)\(w\) 即可。

Subtask 2

考虑让本质不同的方案尽可能少,比如只有两种。(Subtask 1 中只需一种)

\(w\) 为偶数时,任意两个 \(w/2\) 可以凑成一个 \(w\)。那么,如果总共放 \(a\)\(w/2\),就能贡献 \(\dbinom{a}{2}\) 种方案。这时余下还需要的方案不会太多,沿用 Subtask 1 的做法,再放上 \(c-\dbinom{a}{2}\)\(w\) 即可。

通过计算可以发现 \(c\le 3\times 10^6\) 时,这种做法最多使用不超过 \(4900\) 个物品。

那么,\(w\) 是奇数怎么办呢?可以发现加一个 \(1\) 就能(大部分情况下)不影响答案地归约到 \(w-1\) 的情况,因为如果不选这个 \(1\),只用两个 \((w-1)/2\) 是凑不出 \(w\) 的。

这种做法只在 \(w=3\) 时会出问题。特判它,枚举放了 \(a\)\(1\)\(b\)\(2\),那么就有 \(\dbinom{a}{3}+ab\) 种方案,挑一个跟 \(c\) 最接近的就行。通过计算,可以发现这样做用的物品数只有 \(\displaystyle O\left(\sqrt[3] c\right)\),并不影响大局。

Subtask 3

做法很多。比较容易从 Subtask 2 想到的是这种。

结合 \(w=3\) 时的做法和 \(w\) 是奇数的处理方法,当 \(w\bmod 3=0\) 时沿用 \(w=3\) 的做法,把 \(1,2,3\) 分别改为 \(w/3,2w/3,w\) 就行;否则先放一个 \(w\bmod 3\),再按照 \(w\bmod 3\) 的做法处理。

这个做法需要特判掉 \(w=4,5,8\) 的情况。

\(w=4,5\) 时本质不同的方案很少,把式子列出来然后枚举就行。\(8\)\(4\) 的倍数,完全可以利用 \(w=4\) 的做法。

这个做法最多需要 \(4543\) 个物品,可以通过本题。


Subtask 3 的瓶颈在于 \(w=3\),然而 \(w=3\) 的情况其实已经是不可改进的了。
可以发现,这个问题中最难的部分是 \(w\) 比较小的情况。

posted @ 2024-02-12 19:59  cndark_moon  阅读(24)  评论(0)    收藏  举报