Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1527628
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类: LINUX

2010-09-18 23:49:32











无界背包问题

如果重量w1, ..., wnW都是非负的,那么用动态规划,可以用伪多项式时间解决背包问题。下面描述了无界背包问题的解法。

简便起见,我们假定重量都是正的(wj > 0)。在总重量不超过W的前提下,我们希望总价格最高。对于Y ≤ W,我们将在总重量不超过Y的前提下,总价格所能达到的最高值定义为A(Y)。A(W)即为问题的答案。

显然,A(Y)满足:

  • A(0) = 0
  • A(Y) = max { A(Y - 1), max { pj + A(Y - wj) | wj ≤ Y } }

其中,pj为第j种物品的价格。

如果总重量为0,总价值也为0。然后依次计算A(0), A(1), ..., A(W),并把每一步骤的结果存入表中供后续步骤使用,完成这些步骤后A(W)即为最终结果。由于每次计算A(Y)都需要检查n种物品,并且需要计算WA(Y)值,因此动态规划解法的时间复杂度为O(nW)。如果把w1, ..., wnW都除以它们的最大公因数,算法的时间将得到很大的提升。

尽管背包问题的时间复杂度为O(nW),但它仍然是一个NP完全问题。这是因为W同问题的输入大小并不成线性关系。原因在于问题的输入大小仅仅取决于表达输入所需的比特数。事实上,log W,即表达W所需的比特数,同问题的输入长度成线性关系。

阅读(1546) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~