1 条题解

  • 0
    @ 2025-12-10 17:23:01

    题意简化

    容量为 nn 的背包,有 nn 种物品:

    • ii 种物品体积为 ii
    • ii 种物品最多可以用 ii

    求装满背包的方案数,模 2333333323333333

    n105n \le 10^5

    核心思想:根号分治

    1. 问题分析

    这是多重背包问题,但 nn 很大,直接 DP O(n2)O(n^2) 会超时。

    观察:物品体积从 11nn,但大体积物品数量少。

    2. 根号分治

    m=nm = \lfloor \sqrt{n} \rfloor(约 316)。

    将物品分为两类:

    1. 小物品:体积 m\le m(约316种)
    2. 大物品:体积 >m> m(约 nmn-m 种)

    3. 分别处理

    第一部分:大物品(体积 > m)

    大物品最多用 nm+1\lfloor \frac{n}{m+1} \rfloor 个,数量少。

    dp1[i][j]dp_1[i][j]:用了 ii 个大物品,体积和为 jj 的方案数。

    转移:

    • 加一个体积最小的(m+1m+1):dp1[i][j]=dp1[i1][j(m+1)]dp_1[i][j] = dp_1[i-1][j-(m+1)]
    • 所有大物品体积+1(巧妙转化):dp1[i][j]=dp1[i][ji]dp_1[i][j] = dp_1[i][j-i]

    最终 g[j]=idp1[i][j]g[j] = \sum_{i} dp_1[i][j] 表示用大物品凑出体积 jj 的方案数。

    第二部分:小物品(体积 ≤ m)

    小物品体积小但数量多,用前缀和优化的多重背包。

    dp2[i][j]dp_2[i][j]:只考虑前 ii 种小物品(体积1..i),凑出体积 jj 的方案数。

    转移(完全背包但有限制):

    $$dp_2[i][j] = \sum_{k=0}^{\min(i, \lfloor j/i \rfloor)} dp_2[i-1][j-k\cdot i] $$

    用前缀和优化到 O(1)O(1)

    • 维护前缀和数组 sum[j]sum[j]
    • 注意每个物品最多用 ii 个,所以减去 ji(i+1)j \ge i(i+1) 的部分

    最终 f[j]=dp2[m][j]f[j] = dp_2[m][j] 表示用小物品凑出体积 jj 的方案数。

    4. 合并答案

    背包总容量 nn,可以:

    • 用大物品凑 ii 体积
    • 用小物品凑 nin-i 体积

    方案数:

    ans=i=0nf[i]×g[ni]ans = \sum_{i=0}^n f[i] \times g[n-i]

    代码解析

    变量说明

    • m = sqrt(n):分界点
    • dp_1[][]:大物品 DP
    • dp_2[][]:小物品 DP
    • f[], g[]:最终方案数
    • sum[]:前缀和优化

    函数功能

    1. solve_1():处理大物品
    2. solve_2():处理小物品(前缀和优化多重背包)

    复杂度分析

    • 大物品 DP:O(n×n)O(\sqrt{n} \times n)
    • 小物品 DP:O(n×n)O(\sqrt{n} \times n)
    • 总复杂度:O(nn)3×107O(n\sqrt{n}) \approx 3\times 10^7,可过 n=105n=10^5

    关键优化

    1. 根号分治

    • 大物品:体积大,数量少,用特殊 DP
    • 小物品:体积小,用优化的多重背包

    2. 大物品的巧妙转化

    将所有大物品体积同时+1的转移,减少状态数。

    3. 前缀和优化

    小物品多重背包用前缀和降到 O(1)O(1) 转移。

    样例解释

    n=3n=3,物品:

    • 体积1:最多1个
    • 体积2:最多2个
    • 体积3:最多3个

    方案:

    1. 1+1+1
    2. 3

    输出:2

    代码特点

    • 根号分治经典应用
    • 大物品的特殊 DP 设计
    • 小物品前缀和优化
    • 模运算处理
    • 1

    信息

    ID
    6018
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者