P2851 The Fewest Coins G(混合背包基础,鸽巢原理)
-
我会暴力!
农夫最多有 \(T=70500000\) 元钱。
使用单调队列优化多重背包,时间复杂度是 \(O(nT)\) 级别的。
简而言之,先暴力去做最小硬币数,再将负值硬币看作一个物体跑完全背包刷表法。 -
正解
思路来源于 Link。
卡上界。
什么叫上界?就是说,只要某指标超过这个数,那一定可以调整该方案,使得方案更优。
注意到,若干个 \(V_{\max}\) 的决策是局部最优解。
首先,由鸽巢原理,商家使用非 \(V_{\max}\) 个数上界为 \(V_{\max}-1\),
否则做前缀和,从 \(S[0\to V_{\max}]\),一定存在一个连续段可以用更少的 \(V_{\max}\) 替代。- 商家没用过 \(V_{\max}\)
商家找的钱少于 \(V_{\max}^2\),于是 John 付的钱少于 \((T+V_{\max}^2)\)。 - 商家用过 \(V_{\max}\)
于是 John 没用过这种硬币。- John 用过的小面额硬币小于 \(V_{\max}\) 张
于是 John 付的钱少于 \((V_{\max}^2)\)。 - John 用过的小面额硬币大于等于 \(V_{\max}\) 张
在其中拿出 \(V_{\max}\) 张,必然能找到一些硬币,使得和为 \(V_{\max}\) 倍数。
不难证明,这个值严格小于 \(V_{\max}^2\)。
所以,商家找的 \(V_{\max}\) 硬币上界个数为 \(V_{\max}-2\),否则双方都可以舍弃这一部分硬币。
上界往松了计算,就得到 \(2V_{\max}^2+T\) 了。
- John 用过的小面额硬币小于 \(V_{\max}\) 张
- 商家没用过 \(V_{\max}\)

浙公网安备 33010602011771号