看不懂背包解决方案

2023-12-12

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

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  

我在网上找到的所有示例的结构都是相同的。
我无法理解的是这段代码如何考虑到最大值可能来自smaller背包?例如。如果背包容量为 8,则最大值可能来自容量 7 (8 - 1)。
我找不到任何逻辑来考虑也许最大值来自较小的背包。这是错误的想法吗?


背包的动态规划解法基本上是递归的:

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]

(如果您设置了,则 else 条件在递归形式中是多余的T(i,j) = -infinity对于每个j < 0).

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

由于它是递归完成的 - 您可以有效地检查将元素分配给背包的所有可能性。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

看不懂背包解决方案 的相关文章

随机推荐

  • 用于阻止特定日期(假期)的引导日期选择器配置

    有谁知道如何配置日期选择器不显示特定日期 例如 7 月 4 日 这似乎可以使用 beforeShowDay 来完成 但我并不肯定 http jsfiddle net Lr3taznx a array of dates that should
  • 如何启用cookie

    我有这个任务来读取 写入 启用 cookie 以便将用户名存储在变量中 然后写入 cookie 我的问题是代码的最后一部分似乎正在工作 但是用户名应该存储到变量中的第一部分不起作用 我可以看到当我运行代码时 前两个警报框没有显示 它应该以
  • React传单和react-leaflet-draw

    我正在尝试在传单地图上实现绘制功能 我创建了一个仅安装了react leaflet的新应用程序 使用npx create react app并安装了以下软件包 npm install React React dom 传单 npm 安装反应传
  • 复制到剪贴板在 Android 上不起作用

    使用此视图创建标准移动应用程序 public class DebugView extends View ListView
  • 为什么 sys.getrefcount 给出巨大的值?

    import sys a 10 b a print sys getrefcount a b 1 print sys getrefcount b output 22 614 我的Python解释器有问题吗 为什么这会给出像 614 这样巨大的
  • Android:Proguard 的推荐配置是什么?

    我正在为 Android 开发应用程序并使用 Proguard 来混淆代码 目前我正在使用 ProGuard 配置 optimizationpasses 5 dontusemixedcaseclassnames dontskipnonpub
  • MVC4 & IClientValidatable - 自动 AJAX 调用服务器端验证

    我正在寻找在 MVC4 中实现自定义客户端验证 我目前让它与标准属性配合得很好 例如我的模型中的这个 public class UploadedFiles StringLength 255 ErrorMessage Path is too
  • 使用 std::for_each 和 std::views::iota 的并行 for 循环

    我想使用以下方法为基于并行索引的 for 循环设置一个简单的解决方法std views 为了按顺序运行 代码如下所示 int main pseudo random numbers random device rd default rando
  • 使多维数组唯一的php

    我的数组如下所示 大批 1 gt stdClass Object id gt 225 user id gt 1 name gt Blue Quilted Leather Jacket by Minusey 499 2 gt stdClass
  • 添加行时数据表中的重复列

    我创建一个 DataTable 并将其绑定到 DataGrid 我的数据源由一个表 FooTable 组成 该表由一列 FooName 组成 以下代码运行良好 除了每次添加新行时 都会有一个重复的列填充相同的数据 我不知道如何摆脱它 请参阅
  • 使用 XPATH 或 CSS 选择器在 Selenium 中查找元素

    我试图在 C 中使用 Selenium Webdriver 查找元素 导入 已尝试以下代码但没有找到它 driver FindElement By XPath class menu bg ul li 3 Click driver FindE
  • 正确删除单例

    我有以下代码 我的类 h static MyMutex instanceMutex static MyClass getInstance static void deleteInstance 我的类 c MyMutex MyClass in
  • 卷曲发送内容长度标头时出现问题

    我需要将文件上传到 wupload 这是我的功能 public function doPost link postfields cookie ref nobody false upload false header true headers
  • 当类型参数之一应该为 Nothing 时,为什么 Scala 的隐式类不起作用?

    Update 我修改了示例以便可以编译和测试 我有一个定义丰富方法的隐式类 case class Pipe I O R f I gt O R object Pipe The problematic implicit class implic
  • Docker - 名称已被容器使用

    运行docker使用以下命令的注册表总是会抛出错误 dev tmp me docker run d name registry v1 e SETTINGS FLAVOR local e STORAGE PATH registry e SEA
  • PowerShell Tee-Object 未捕获文件中的调试行

    我有一个通过自动化运行的 PowerShell 脚本 因此我需要将脚本的输出捕获到文件中 但我还想捕获运行的命令 为输出提供一些上下文 我会使用set x在 Linux shell 脚本中 不过 我不知道如何将这些命令捕获到 Windows
  • Typescript 实例化通用对象

    我遇到了这个问题 搜索了几个小时却找不到合适的解决方案 我正在尝试创建一个通用函数来恢复类型和对象并将对象转换为该特定类型 但我在实例化泛型类型时遇到了麻烦 我想知道 c Activator CreateInstance 中是否有类似的东西
  • 从 spring mvc 设置选择框值

    如何从控制器在 jsp 中设置选择框值 Employee employee new Employee 我为实体创建了新对象Employee然后设置值 用这个代码指定 employee setEmpDesignation addEmploye
  • 使用 Windows PowerShell 设置 .SSH 密钥时出错

    我已经让 GIT BASH shell 与 SSH 密钥一起正常工作 所以我知道我的基本配置步骤是正确的 但我更喜欢 Windows powershell 实际上我更喜欢 Mac 或 Linux 终端 但没有可用的选项 Anyways 我的
  • 看不懂背包解决方案

    在维基百科中 Knapsack 的算法如下 for i from 1 to n do for j from 0 to W do if j gt w i then T i j max T i 1 j T i 1 j w i v i 18 el