背包问题
背包问题有些类似很多年以前的购物的综艺节目:如何装满购物车使得物品总价值最大,注意到物品除了价值以外,还有体积属性。
背包(判定)问题询问是否能从一堆物体中找一个子集,使得物品的总体积小于某值,总价值大于某值。
实例: 有限集合 U, 每个元素 u∈U, 都有相立的长度(体积) S(u)∈Z+ 和价值 V(u)∈Z+, 并且有常数 B∈Z+ 和 K∈Z+ 。
询问: 是否存在子集 U′⊆U, 满足 ∑u∈US(u)⩽B,∑u∈UV(u)⩾K∘
该问题可以通过划分问题多项式归约证明为 NPC
NPC 证明
对背包问题的实例施加限制:对任意 u∈U, 取 S(u)=V(u) 且 ∑u∈US(u) 为偶数,
取 B=K=21∑u∈US(u) 。
如此限制的实例为划分问题实例。
这里的逻辑有必要重新叙述一遍:对背包问题的实例施加限制后转变为了划分实例,表示的意思是,所有的划分实例都可以看成是背包问题施加了限制后的实例,也即划分实例可以被转换为背包问题实例的一个子集。
近似算法性能比
- 将 n 个元素排序得到 L={(P1,W1),(P2,W2),⋯,(Pn,Wn)}, 满足:
W1P1⩾W2P2⩾⋯⩾WnPn
- 采用贪心算法 GA, 在主次表 L 中,自标号为 1 的元素到标号为 n 的 元素,逐个试装入背包,若标号 i 的元素能装入背包,则取 xi=1, 否 则取 xi=0 。直到不能装入为止,得到一个可行解,其解值为 GA(I) 。
- 取 A(I)=max{GA(I),max1⩽i⩽nPi} 所对应的元素装入背包,得实例 I 的可行解。
背包问题有多项式时间近似算法 A, 其绝对性能比 RA<2 。
证明:
因为背包问题重量上限为 B,令最优解为 OPT(I),则设正整数 r,满足 ∑i=1rWi⩽B,∑i=1r+1Wi>B。
易得
OPT(I)<i=1∑r+1Pi⩽i=1∑rPi+1⩽i⩽nmaxPi⩽2A(I)
其中因为 A(I)=max{GA(I),max1⩽i⩽nPi},所以
i=1∑rPi+1⩽i⩽nmaxPi⩽2A(I)
所以
RA(I)=A(I)OPT(I)<2
RA=inf{RA(I)∣I为背包问题任意实例}<2
背包问题无多项式时间绝对近似算法的证明
暂略