1 条题解

  • 0
    @ 2025-10-27 22:06:51

    题目分析

    这是一个装备合成树上的依赖背包问题。装备构成树形结构,基本装备是叶子节点,高级装备是非叶节点。目标是使用 mm 个金币获得最大力量值。


    算法思路:树形依赖背包

    状态设计

    定义 dp[u][i][j]dp[u][i][j]:在节点 uu 的子树中,制造 iiuu 装备给父节点使用,花费 jj 金币时获得的最大力量值。

    关键步骤

    1. 预处理合成限制

      for(auto [v,w] : G[u]) {
          dfs(v);
          pc[u] += pc[v] * w;           // 计算合成一个u所需金币
          am[u] = min(am[u], am[v]/w);  // 计算最大合成数量
      }
      am[u] = min(am[u], m/pc[u]);      // 受金币限制
      
    2. 基本装备处理(叶子节点)

      for(int i=0; i<=am[u]; i++) {
          for(int j=0; j<=i; j++) {
              dp[u][j][i*pc[u]] = (i-j)*a[u];  // j个给父节点,i-j个自己用
          }
      }
      
    3. 高级装备处理(非叶节点)

      • 枚举制造数量 ii
      • 对每个子节点进行背包合并
      • 更新 dpdp 状态

    动态规划转移

    对于高级装备 uu 制造 ii 个:

    • 需要每个子节点 vv 提供 i×wi \times w 个装备
    • 使用背包合并子节点方案:$$pd[j] = \max(pd[j], pd[j-k] + dp[v][i \times w][k]) $$
    • 最终状态:dp[u][j][k]=pd[k]+(ij)×a[u]dp[u][j][k] = pd[k] + (i-j) \times a[u] 其中 jj 个给父节点,iji-j 个自己使用

    算法流程

    1. 建图:根据输入建立装备合成树
    2. DFS处理:从叶子到根进行树形DP
    3. 根节点合并:将所有根节点的结果合并到最终答案
    4. 输出ans[m]ans[m] 即最大力量值

    复杂度分析

    • 状态数O(n×am×m)O(n \times am \times m),其中 am100am \leq 100
    • 背包合并O(m2)O(m^2) 每次合并
    • 总复杂度O(n×am×m2)O(n \times am \times m^2),在 n51,m2000n \leq 51, m \leq 2000 时可行

    样例验证

    输入

    10 59
    5 A 3 6 1 9 2 10 1
    1 B 5 3
    1 B 4 3
    1 B 2 3
    8 A 3 2 1 3 1 7 1
    1 B 5 3
    5 B 3 3
    15 A 3 1 1 5 1 4 1
    1 B 3 5
    1 B 4 3
    

    处理过程

    • 构建装备合成树
    • 自底向上计算DP值
    • 在金币限制下优化装备选择

    输出33,与样例一致。


    算法优势

    • 树形结构处理:准确建模装备依赖关系
    • 依赖背包:正确处理合成约束
    • 数量限制:考虑基本装备购买上限
    • 最优性保证:动态规划确保找到最优解

    该解法通过树形依赖背包,高效解决了装备合成系统中的资源分配问题。

    • 1

    信息

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