给定
个物品,每个物品都有其重量
和价值
以及一个容量为
的背包,01背包问题是在满足不超过背包容量的前提下在给定的
个物品中挑选若干个物品,使得所挑选的物品的价值总和最大。
经典的01背包求解方式是通过动态规划求解,算法的时间复杂度为
,但是这个算法实际上并不是一个多项式时间算法。我们一般衡量算法的时间复杂度是判断它是否是关于输入规模大小的多项式函数。
只是一个输入数据,它可以表示成输入规模
的指数形式,因此这个算法实际上是一个伪多项式算法。
实际上01背包问题是NP-hard的,我们无法在多项式时间求到它的最优解。但是我们可以在多项式时间内求到它的一个可行解。比如,我们可以用贪心算法来求解。对于每一个物品,按照它的性价比(价值/重量)排序,优先选择性价比高的物品。若
,则全选。不妨设
,假设
是满足
的最大数值,那么将
作为算法的解。很显然的是,这样的贪心选择策略并不是正确的。假设我们有3个物品
,其重量分别为
,价值分别为
,其性价比分别为
。假设背包容量为
,则按照这个策略,应该选择
和
,所得价值为160。但是最优解是选择
和
,所得价值为220。虽然,这个贪心算法返回的一个局部最优解,但是我们可以证明在最坏的情况下,它返回的解至少是最优解的
。
证明之前,我们先简单了解一下近似算法。近似算法是针对一个优化问题而言的,该优化问题是一个最大化问题或者最小化问题。以最大化问题为例子,假设多项式算法
返回的值为
,最优解为
,我们用一个比值
来衡量
返回的解跟最优解之间的偏离程度。这个比值,通常称为近似比。近似比越接近
,说明算法的效果越好。近似算法主要是为那些NP-hard的问题提供一个多项式时间的可行解的解决方案,可以理解成它是在时间代价和求解质量之间寻求一个平衡。近似算法与启发式算法最大的区别就是,近似算法是有严格的理论保证的,即它有近似比。近似比保证了算法在最坏情况下的性能。
按照上述贪心选择策略我们选择了前
个物品,即
。很明显,最优解
满足
,因此,该贪心算法的近似比为2。
若从另一个角度来看,假设我们将每个物品分成若干个小块,那么利用背包最有效的方式就是把前
个先装进背包,再装第
个物品的若干个小块,直到背包装满,因为这样性价比是最高的。这就意味着背包所能装的物品的总价值必然少于
,它是最优解
的一个上界。
版权声明:本文为weixin_42524945原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。