01背包
描述
有 N 件物品, 背包容量为 V, 每件物品 i 耗费 Ci , 得到的价值是 Wi 。求解装入哪些物品使得价值总和最大。
公式
F[i,v]=max{F[i−1,v],F[i−1,v−Ci]+Wi}
伪代码
F[0,0…V]←0
for i←1 to N
for v←Ci to V
F[i,v]←max{F[i−1,v],F[i−1,v−Ci]+Wi}
优化空间复杂度
F[0…V]←0
for i←1toN
for v←V to Ci
F[v]←max{F[v],F[v−Ci]+Wi}
抽象01背包问题
def ZeroOnePack(F,C,W)
for v←V to C
F[v]←max(F[v],F[v−C]+W)
完全背包
描述
N 件物品, 背包容量为 V, 每种物品都有无限件可用,每件物品 i 耗费 Ci , 得到的价值是 Wi 。求解装入哪些物品使得价值总和最大。
公式
F[i,v]=max{F[i−1,v−kCi]+kWi∣0≤kCi≤v}
简单优化
若 Ci≤Cj 并且 WI≥Wj,则去掉物品 j, 不用考虑
转换为01背包求解
考虑到第 i 种物品最多选 ⌊V/Ci⌋ 件, 于是将第 i 种物品转化为 ⌊V/Ci⌋ 件费用及价值均不变的物品,然后求解 01 背包问题
O(VN) 的算法
F[0..v]←0
for i←1 to N
for v←Ci to V
F[v]←max(F[v],F[v−Ci]+Wi)
抽象完全背包问题
def CompletePack(F,C,W)
for v←C to V
F[v]←max{F[v],F[v−C]+W}