Skip to content
Go back

背包

01背包

描述

有 NN 件物品, 背包容量为 VV, 每件物品 ii 耗费 CiC_i , 得到的价值是 WiW_i 。求解装入哪些物品使得价值总和最大。

公式

F[i,v]=max{F[i−1,v],F[i−1,v−Ci]+Wi}F[i, v] = max \{ F[i - 1, v], F[i - 1, v - C_i] + W_i \}

伪代码

F[0,0…V]←0F[0, 0…V] \leftarrow 0

for i←1 to Nfor\ i \leftarrow 1\ to\ N

for v←Ci to Vfor\ v \leftarrow C_i\ to\ V

F[i,v]←max{F[i−1,v],F[i−1,v−Ci]+Wi}F[i, v] \leftarrow max \{F[i-1,v], F[i-1,v-C_i]+W_i\}

优化空间复杂度

F[0…V]←0F[0…V] \leftarrow 0

for i←1toNfor\ i \leftarrow 1 to N

for v←V to Cifor\ v \leftarrow V\ to\ C_i

F[v]←max{F[v],F[v−Ci]+Wi}F[v] \leftarrow max\{F[v], F[v - C_i] + W_i\}

抽象01背包问题

def ZeroOnePack(F,C,W)def\ ZeroOnePack(F, C, W)

for v←V to Cfor\ v \leftarrow V\ to\ C

F[v]←max(F[v],F[v−C]+W)F[v] \leftarrow max(F[v], F[v-C] + W)

完全背包

描述

NN 件物品, 背包容量为 VV, 每种物品都有无限件可用,每件物品 ii 耗费 CiC_i , 得到的价值是 WiW_i 。求解装入哪些物品使得价值总和最大。

公式

F[i,v]=max{F[i−1,v−kCi]+kWi∣0≤kCi≤v}F[i, v] = max\{F[i-1, v-kC_i] + kW_i|0\le kC_i \le v\}

简单优化

若 Ci≤CjC_i \le C_j 并且 WI≥WjW_I \ge W_j ,则去掉物品 jj, 不用考虑

转换为01背包求解

考虑到第 ii 种物品最多选 ⌊V/Ci⌋\lfloor V / C_i \rfloor 件, 于是将第 ii 种物品转化为 ⌊V/Ci⌋\lfloor V/C_i\rfloor 件费用及价值均不变的物品,然后求解 01 背包问题

O(VN)O(VN) 的算法

F[0..v]←0F[0..v] \leftarrow 0

for i←1 to Nfor\ i \leftarrow 1\ to\ N

for v←Ci to Vfor\ v \leftarrow C_i\ to\ V

F[v]←max(F[v],F[v−Ci]+Wi)F[v] \leftarrow max(F[v], F[v-C_i] +W_i)

抽象完全背包问题

def CompletePack(F,C,W)def\ CompletePack(F, C, W)

for v←C to Vfor\ v \leftarrow C\ to\ V

F[v]←max{F[v],F[v−C]+W}F[v] \leftarrow max\{F[v], F[v- C] +W\}


Share this post on:

Previous Post
latex手册
Next Post
plan