Skip to content
Go back

背包

01背包

描述

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

公式

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

伪代码

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

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

for vCi to Vfor\ v \leftarrow C_i\ to\ V

F[i,v]max{F[i1,v],F[i1,vCi]+Wi}F[i, v] \leftarrow max \{F[i-1,v], F[i-1,v-C_i]+W_i\}

优化空间复杂度

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

for i1toNfor\ i \leftarrow 1 to N

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

F[v]max{F[v],F[vCi]+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 vV to Cfor\ v \leftarrow V\ to\ C

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

完全背包

描述

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

公式

F[i,v]=max{F[i1,vkCi]+kWi0kCiv}F[i, v] = max\{F[i-1, v-kC_i] + kW_i|0\le kC_i \le v\}

简单优化

CiCjC_i \le C_j 并且 WIWjW_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 i1 to Nfor\ i \leftarrow 1\ to\ N

for vCi to Vfor\ v \leftarrow C_i\ to\ V

F[v]max(F[v],F[vCi]+Wi)F[v] \leftarrow max(F[v], F[v-C_i] +W_i)

抽象完全背包问题

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

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

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


Share this post on:

Previous Post
latex手册
Next Post
plan