当前位置: 首页 > 知识库问答 >
问题:

无法理解背包解决方案

窦涵忍
2023-03-14

在维基百科中,背包的算法如下:

for i from 1 to n do  
  for j from 0 to W do  
    if j >= w[i] then  
      T[i, j] := max(T[i-1, j], T[i-1, j-w[i]] + v[i]) [18]  
    else  
      T[i, j] := T[i-1, j]  
    end if  
  end for  
end for  

我在网上找到的所有例子的结构都是一样的<我无法理解的是,这段代码是如何考虑到最大值可能来自较小的背包这一事实的?E、 如果背包容量为8,那么最大值可能来自容量7(8-1)<我找不到任何逻辑来考虑最大值可能来自较小的背包。这是错误的想法吗?

共有2个答案

盖向荣
2023-03-14

如我所见,你误解了背包的概念。我将在这里详细描述,直到我们达到代码部分。

首先,有两种版本的问题:

  1. 0-1背包问题:在这里,物品是不可分割的,你要么拿一件物品,要么不拿。可以用动态规划法求解<代码>//这就是你面临的问题
  2. 分数背包问题:现在不要关心这个问题

对于第一个问题,您可以理解为:

给定一个最大容量为W的背包,以及一个由n个物品组成的集合S,每个物品i都有一些权重wi和收益值bi(所有wi和W都是整数值)。

那么,如何包装背包以实现包装物品的最大总价值?

用数学的口吻说:

为了使用动态规划解决这个问题,我们建立了一个表,每个可用项目一行,从0到W的每个权重一列。我们需要仔细识别子问题,

然后,子问题将是计算V[k,w],即在一个大小为w的背包中为Sk={标记为1,2,…k的项目}找到一个最优解(给定容量w和项目1,…,k可达到的最大值)

该算法仅查找背包中可能携带的最大值,即V[n,W]中的值,以了解使该值最大的项目,这将是另一个主题。

我真的希望这个答案能帮助你。我有一个pp演示,它将与您一起填写表格,并逐步向您展示算法。但我不知道如何将其上载到stackoverflow。如果需要帮助,请告诉我。

柯骏
2023-03-14

背包的动态编程解决方案基本上是递归的:

T(i,j) = max{ T(i-1,j) ,         T(i-1,j-w[i]) + v[i] }
       //      ^                         ^
       //  ignore the element       add the element, your value is increase
       //                           by v[i] and the additional weight you can
       //                           carry is decreased by w[i]

(如果为每个<代码>j设置<代码>T(i,j)=-无穷大,则else条件在递归形式中是多余的

这个想法是详尽的搜索,您从一个元素开始,有两种可能性:添加或不添加。
您检查两个选项,并选择其中最好的一个。

因为它是递归完成的——你有效地检查了将元素分配到背包的所有可能性。

请注意,wikipedia中的解决方案基本上是相同递归公式的自下而上解决方案

 类似资料:
  • 我正在尝试在Mac OS 10.12中安装sequelize cli。6. 在终端,我做到了 我得到了 然后,我试着 我得到了 无法解决序列化包在 /Users/bheng/Sites/BASE 我甚至试着按照这篇文章的建议使用。 我得到了同样的结果。 我还应该尝试什么?

  • 希望这是有意义的,我基本上是在寻找一些关于如何开始在Python 3中处理这个任务的见解。提前感谢您能提供的任何东西!

  • 问题内容: 是最新的CSS功能,现代浏览器(至少从2016年7月1日起)尚不可用。 Chrome 51 通过实验性Web平台标志提供支持。 Safari 9.1支持带前缀 Firefox 47不支持 处于这种无法使用的状态,我想知道是否存在任何其他方法来获得相同的结果。 也欢迎针对,,…的JS解决方法 可以通过跟踪的发展 问题答案: 从Chrome M76开始,背景音乐滤镜现已出厂,没有前缀,并且

  • 问题内容: 我想要一个类属性,该表达式允许在等号的右侧进行表达式。所有版本的PHP都会阻塞以下代码,但是这种编写方式是为了将来更容易扩展。 对我来说,这似乎是非常基本的语法,并且为什么PHP不允许这样的事情是不可理解的。谁能想到可以保持以下代码的可读性和将来可扩展性的解决方法? 问题答案: 在PHP中声明类常量或属性时,只能为默认值指定原始值。因此,例如,该类声明将不起作用: 但是该类声明将: 这

  • 遵循官方文件(https://camel.apache.org/manual/component-dsl.html#_using_component_dsl)我创建了以下代码: 但是中的告诉我: 并且中的特性不建议导入相应的库。 有人能给我指一下正确的方向吗 要做到这一点,我必须理解依赖注入的概念吗?

  • 我正在为即将到来的测试复习,想知道是否有人能重述问题的b部分。这是从分发的复习表中得到的文本,但我不确定b部分到底在问什么。我更直截了当地猜测“生成一个不到0/1背包问题最优值1%的解”是什么意思。 b)[10pts]举了一个有两个对象的例子,说明对分数背包问题使用的相同的贪婪方法(略加修改,如果贪婪方法选择的最后一个对象不适合,则忽略它)得到的解不到0/1背包问题最优解的1%。