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\) 了。
posted @ 2026-02-16 17:41  2025ing  阅读(0)  评论(0)    收藏  举报