完全背包

发表于 2025-07-08 178 字 1 min read

文章目录
完全背包的状态定义与正序遍历的原因,与 01 背包的差异。

本篇对应源码见仓库 solutions/xcpc/algorithm/dp/knapsack-complete/。

问题分析

  • 给定背包最大容量 V, n 件物品,每件物品有重量(体积)w, 价值 v,每件物品可以选择无数次,求背包能装下物品的最大总价值。
  • 在01背包的基础上将遍历方式正序遍历背包容量即可实现不限次选择物品

状态定义

  • 使用滚动数组(一维)
  • dp[j]dp[j] 背包容量为 jj 时能装的最大价值

遍历方式

  • 二重循环
  • 第一层枚举物品(for i in 1..nfor\ i\ in\ 1..n)
  • 第二层正序枚举背包容量(for j in W..w[i]for \ j \ in\ W..w[i])

状态转移方程

dp[j] = max(dp[j], dp[j - w[i] + v[j]