背包0-1个定量

2024-01-27

我正在编写具有多个约束的背包 0-1 的变体。除了重量约束之外,我还有数量约束,但在本例中,我想解决背包问题,因为我的背包中需要恰好有 n 件物品,且重量小于或等于 W。目前正在为简单的 0-1 案例实现动态编程 ruby​​ 解决方案,基于 Rosetta Code 中的代码http://rosettacode.org/wiki/Knapsack_problem/0-1#Ruby http://rosettacode.org/wiki/Knapsack_problem/0-1#Ruby.

实施固定数量限制的最佳方式是什么?


您可以向表中添加第三个维度:项目数。所包含的每个项目都会增加重量维度中的重量和计数维度中的计数。

def dynamic_programming_knapsack(problem)
  num_items = problem.items.size
  items = problem.items
  max_cost = problem.max_cost
  count = problem.count
  cost_matrix = zeros(num_items, max_cost+1, count+1)

  num_items.times do |i|
    (max_cost + 1).times do |j|
      (count + 1).times do |k|
        if (items[i].cost > j) or (1 > k)
          cost_matrix[i][j][k] = cost_matrix[i-1][j][k]
        else
          cost_matrix[i][j][k] = [
              cost_matrix[i-1][j][k],
              items[i].value + cost_matrix[i-1][j-items[i].cost][k-1]
            ].max
        end
      end
    end
  end
  cost_matrix
end

要找到解决方案(选择哪些项目),您需要查看网格cost_matrix[num_items-1][j][k],对于所有值j and k,并找到具有最大值的单元格。

一旦找到获胜的单元格,您需要向后追踪到开始处(i = j = k = 0)。在您检查的每个单元格上,您需要确定项目是否i是否习惯到达这里。

def get_used_items(problem, cost_matrix)
  itemIndex = problem.items.size - 1
  currentCost = -1
  currentCount = -1
  marked = Array.new(cost_matrix.size, 0) 

  # Locate the cell with the maximum value
  bestValue = -1
  (problem.max_cost + 1).times do |j|
    (problem.count + 1).times do |k|
      value = cost_matrix[itemIndex][j][k]
      if (bestValue == -1) or (value > bestValue)
        currentCost = j
        currentCount = k
        bestValue = value
      end
    end
  end

  # Trace path back to the start
  while(itemIndex >= 0 && currentCost >= 0 && currentCount >= 0)
    if (itemIndex == 0 && cost_matrix[itemIndex][currentCost][currentCount] > 0) or
        (cost_matrix[itemIndex][currentCost][currentCount] != cost_matrix[itemIndex-1][currentCost][currentCount])
      marked[itemIndex] = 1
      currentCost -= problem.items[itemIndex].cost
      currentCount -= 1
    end
    itemIndex -= 1
  end
  marked
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

背包0-1个定量 的相关文章

  • 找到一个数是素数,为什么检查到n/2更好。避免n后半部分的数字的原因是什么

    要检查一个数是否是素数 最简单的方法是尝试将这个数除以 2 到 n 如果任何操作得到余数为 0 那么我们就说给定的数不是素数 但最好只进行划分和检查直到 n 2 我知道更好的方法是直到 sqrt n 我想知道跳过后半部分的原因 假设我们是否
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 欧拉项目 45

    我还不是一名熟练的程序员 但我认为这是一个有趣的问题 我想我应该尝试一下 三角形 五边形 六边形 数字由以下生成 公式 三角形 T n n n 1 2 1 3 6 10 15 五边形 P n n 3n 1 2 1 5 12 22 35 六角
  • 如何在 Unity 中对齐“轨道”或模块化对象?

    我正在开发一个简单的游戏 用户可以在其中放置不同但模块化的对象 例如 轨道 道路等 我的问题是 当将一个物体靠近另一个物体时 如何匹配和放置不同的物体 我的第一种方法是为每个模块对象创建一个隐藏的子对象 一个盒子 并将其放在可以放置其他对象
  • 融合元组以查找等价类

    假设我们有一个包含 k 个元素的有限域 D d1 dk 我们认为 S 是 D n 的子集 即一组 形式的元组 其中 ai 在 D 中 我们希望使用 S 2 D n 的子集 即一组 形式的元组 其中 Ai 是 D 的子集 来 紧凑地 表示它
  • 依次构建完整的 B 树

    如果我有一组排序的数据 我想以最适合顺序读取和随机查找的方式将其存储在磁盘上 那么 B 树 或其中一个变体 似乎是一个不错的选择 假设该数据集并不全部适合 RAM 问题是可以从一组排序的数据构建完整的 B 树而不进行任何页面拆分吗 这样排序
  • 关于逻辑/算法的想法以及如何防止线程写入 Sql Server 中的竞争

    我有以下逻辑 public void InQueueTable DataTable Table int incomingRows Table Rows Count if incomingRows gt RowsThreshold async
  • 分组符号最大长度平衡子序列

    将 B 视为分组符号 和 的序列 如果 B 的长度为 0 或 B 具有以下形式之一 则称 B 为平衡序列 X Y 或 X Y 或 X Y 其中 X 和 Y 本身是平衡的 平衡示例 现在的问题是找到一种有效的算法来找到给定输入的最大长度平衡子
  • 计算给出数组中最小标准差的子集

    让我们有一个大小的向量N 例如 x rand N 1 我想计算长度子集的最小标准差K在向量中 When N and K很小 很容易找到最好的子集 因为我可以使用nchoosek N K 枚举所有可能的子集 但是当值N and K比我们说的要
  • 求一根棒可以切割的最大片数

    这是完整的问题陈述 给定一根长度为n的绳子 你需要找到最大的绳子数你可以让每一段的长度都在集合 a b c 中给定三个值a b c 我知道可以通过动态规划来实现最优解 但是 我还没有学过这个主题 我需要递归地解决这个问题 对于递归 主要的事
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 逐字遍历句子

    如何逐字遍历任何给定的句子 java中有内置函数吗 我不知道如何开始 像这样的事情 String sentence Your sentence here String words sentence split s splits by whi
  • 将数字 n 拆分为 k 个不同数字的总和

    我有一个数字 n 我必须将它分成 k 个数字 使得所有 k 个数字都是不同的 k 个数字的总和等于 n 并且 k 最大 例如 如果 n 为 9 则答案应为 1 2 6 如果 n 为 15 则答案应为 1 2 3 4 5 这就是我尝试过的 v
  • 在哪里可以找到有关双三次插值和 Lanczos 重采样的好读物?

    我想用 C 实现上述两种图像重采样算法 双三次和 Lanczos 我知道现有的实现有几十种 但我仍然想制作自己的实现 我之所以这么做 部分原因是我想了解它们是如何工作的 部分原因是我想为它们提供一些主流实现中没有的功能 例如可配置的多 CP
  • 使用 stl sort 对表进行排序

    我有一个巨大的表 约 50Gb 格式为 i j k 来自稀疏矩阵 存储为 uint32 t idx1 idx2 float vals uint32 t tablesize 我想使用给定的比较函数 即 idx1 和 idx2 的函数 对其进行
  • 算法 - 树中所有节点的最大距离

    所以 找到树中两个节点之间的最长路径相当容易 但我想要的是找到从节点出发的最长路径x到树中的另一个节点 对于所有x 这个问题也可以用以下方式表达 计算从给定的树中可以生成的所有有根树的高度 One way of course is to j
  • 为什么使用 no-op 来填补 paxos 事件之间的空白是合法的?

    我正在学习Paxos算法 http research microsoft com en us um people lamport pubs paxos simple pdf http research microsoft com en us
  • 如何在大空间尺度上加速A*算法?

    From http ccl northwestern edu netlogo models community Astardemo http ccl northwestern edu netlogo models community Ast
  • 查找数组中 2 个缺失数字的最快方法

    这个问题的存在只是出于纯粹的好奇心 不是作业 找到在数组 1 n 中找到两个缺失数字的最快方法 因此 在相关帖子中 查找数字数组中缺失数字的最快方法 https stackoverflow com questions 2113795 qui
  • RNG 技术的可移植性和可重复性

    我可以使用两种方法之一来创建一个伪随机数序列 该序列具有两个重要特征 1 它可以在不同的机器上重现 2 该序列永远不会重复范围内的数字 直到所有数字都被发出 我的问题是 这两种方法在可移植性 操作系统 Python 版本等 方面是否存在潜在

随机推荐

  • 获取正在运行的进程列表,获取活动进程(及其应用程序)Flex/AIR

    只是一个快速的 或者 也许不是 是否可以以某种方式获取正在运行的应用程序 进程的列表 并在后台运行时检查哪个进程处于活动状态 另外 如果不知何故 答案是肯定的 是否可以对活动窗口 应用程序的更改做出反应 就像它是事件一样 或者绑定到它的自定
  • 交叉编译:如何使用一个前缀安装,并使用不同的前缀部署?

    我正在尝试为替代架构交叉编译一些应用程序 我的典型流程如下 下载源代码并将其解压到 var source 中 configure prefix var install CC my cross compiler gcc make 进行安装 这
  • 从 React.js 进行 RESTful API 调用

    我正在为同构 JavaScript 应用程序做一个 POC 以从服务器端渲染 HTML POC 使用简单的 HTML 但我想进行 API 调用并获取 JSON 响应并将其发送到渲染函数 我尝试了各种方法但它不起作用 我缺少什么 我对 Rea
  • Javascript 指针/引用的疯狂。有人可以解释一下吗?

    Javascript 通过引用传递对象 这是完全有道理的 但是一旦你开始操纵这些对象 一切都会以一种看起来不直观的方式运作 让我举个例子 var a b a b a a one console log JSON stringify a ou
  • 无法使用selenium web驱动程序连接到电子/CEF应用程序

    我正在尝试使用此示例代码自动化 electron api demos 1 app public static void main String args throws IOException InterruptedException int
  • asp.net MVC:本地化

    我的目标语言在 Session lang 中 它是 en 或 it 我已将其添加到 Site master 中
  • Java 中的线程是否依赖于平台?

    很明显 操作系统调度 线程算法对 Java 线程有影响 但是 我们可以有把握地说线程依赖于操作系统 机器吗 如果是这样的话 那么 Java 平台不依赖吗 是的 Java 中线程调度的细节取决于 JVM 实现 并且 通常 也取决于操作系统实现
  • 是否可以将 Stripe Connect 与 Meteor.js 一起使用?

    有人成功集成了 Stripe Connect 和 Meteor js 吗 我已经使用 Stripe Checkout 通过 Meteor 包向买家收取付款 但我现在正在研究建立一个买家和卖家可以直接进行交易的市场 我还没有找到任何适用于 M
  • 棘手的 I一次性问题

    我试图抽象 封装以下代码 以便所有客户端调用都不需要重复此代码 例如 这是从视图模型 MVVM 到 WCF 服务的调用 using var channelFactory new WcfChannelFactory
  • 在没有选择器错误的情况下使用包

    我正在使用这个名为的配置库Viper https github com spf13 viper 在我的主要内容中 我有这个 viper SetConfigName development viper AddConfigPath config
  • Try-catch 创建无限循环[重复]

    这个问题在这里已经有答案了 我需要能够接受用户输入 直到输入大于初始价格 但我还需要使其稳健 以便用户无法通过输入双精度 整数以外的内容来破坏程序 如果用户确实输入了 double int 以外的内容 问题在于它创建了一个循环并重复 请输入
  • WPF // MahApps.Metro // Caliburn.Micro // 弹出控件 // HeaderedContentControl

    自从 MahApps Metro 1 5 0 发生变化以来 Flyout 的基本元素已从ContentControl to HeaderContentControl 现在使用 Caliburn Micro 和 MVVM 方法this htt
  • Android 原生代码:将 Surface 分配给特定显示器

    我正在寻找一种将 Surface 本机窗口 对象分配给显示器的方法 以便提交到该本机窗口的缓冲区将渲染到该特定显示器而不是主显示器 我想用本机代码来做到这一点 在Java中 可以通过使用Presentation API来完成 在本机代码中我
  • Mockito:如何测试构造函数被调用?

    我正在使用 Mockito 来测试 Java 应用程序中的方法 如何测试构造函数是否被调用过一次 我正在尝试进行类似的验证 verify myClass times 1 doSomething anotherObject 但我无法验证构造函
  • python 通过列表创建一个包含一行的数据框

    在Python中 假设我有一个列表 1 2 3 100 我想使用这个列表创建一个数据框 其中有一行 行值是列表 最快且优雅的方法是什么 将列表作为列表参数传递给data In 11 l range 1 100 pd DataFrame da
  • 在 Django 中通过哈希有效保存文件

    我正在开发一个 Django 项目 我希望用户能够做的是上传文件 通过表单 然后将文件本地保存到自定义路径并使用自定义文件名 其哈希值 我能想到的唯一解决方案是使用我正在使用的 FileField 的 upload to 参数 这意味着什么
  • 找不到与给定名称匹配的资源(在“title”处,值为“@string/action_settings”)

    所以我最近 就像今天最近 开始尝试在eclipse中工作 我一直在关注 Android 开发者初学者课程 到目前为止一切都很顺利 我已经开始构建一个简单的用户界面 http developer android com training ba
  • 无法找到软件包 openssl-dev

    我正在尝试使用 Ubuntu 18 04 在 Linux 上安装 ROOT CERN 软件包 每当我进入先决条件下载时 都使用以下命令 sudo apt get install dpkg dev cmake g gcc binutils l
  • 接口继承一致性

    首先看这段代码 class Program static void Main string args var x Base new Derived IMethod x DoWork Console ReadKey interface IMe
  • 背包0-1个定量

    我正在编写具有多个约束的背包 0 1 的变体 除了重量约束之外 我还有数量约束 但在本例中 我想解决背包问题 因为我的背包中需要恰好有 n 件物品 且重量小于或等于 W 目前正在为简单的 0 1 案例实现动态编程 ruby 解决方案 基于