仅使用集合中的数字查找等于或大于给定目标的总和

2023-11-30

示例1:

商店里卖啤酒,有6瓶和10瓶的。客户输入 26,算法回复 26,因为 26 = 10 + 10 + 6。

示例2:

销售香料,可用包为 0.6、1.5 和 3。目标值 = 5。算法返回值 5.1,因为它是比包 (3、1.5、0.6) 可能实现的目标最接近的更大数字。

我需要一个 Java 方法来建议该数字。

类似的算法描述于装箱问题,但这不适合我。 我尝试了它,当它返回给我的数字小于目标时,我再次以增加的目标数字运行它。但当包数量很大时,效率不高。

我需要几乎相同的算法,但具有相同或更大的最接近的数字。

类似问题:查找一个数字是否是给定集合中两个或多个数字的可能总和 - python.


First let's reduce this problem to integers rather than real numbers, otherwise we won't get a fast optimal algorithm out of this. For example, let's multiply all numbers by 100 and then just round it to the next integer. So say we have item sizes x1, ..., xn and target size Y. We want to minimize the value

k1 x1 + ... + kn xn - Y

在条件下

(1) ki is a non-positive integer for all n ≥ i ≥ 1

(2) k1 x1 + ... + kn xn - Y ≥ 0

一个简单的算法是提出一系列问题,例如

  1. Can we achieve k1 x1 + ... + kn xn = Y + 0?
  2. Can we achieve k1 x1 + ... + kn xn = Y + 1?
  3. Can we achieve k1 x1 + ... + kn xn = Y + z?
  4. 等随着增加z

until we get the answer "Yes". All of these problems are instances of the Knapsack problem with the weights set equal to the values of the items. The good news is that we can solve all those at once, if we can establish an upper bound for z. It's easy to show that there is a solution with z ≤ Y, unless all the xi are larger than Y, in which case the solution is just to pick the smallest xi.

So let's use the pseudopolynomial dynamic programming approach to solve Knapsack: Let f(i,j) be 1 iif we can reach total item size j with the first i items (x1, ..., xi). We have the recurrence

f(0,0) = 1
f(0,j) = 0   for all j > 0
f(i,j) = f(i - 1, j) or f(i - 1, j - x_i) or f(i - 1, j - 2 * x_i) ...

我们可以求解这个 DP 数组O(n * Y)时间和O(Y)空间。结果将是第一j ≥ Y with f(n, j) = 1.

有一些技术细节留给读者作为练习:

  • 如何在 Java 中实现这个
  • 如果需要,如何重建解决方案。这可以在以下位置完成O(n)使用 DP 数组的时间(但是我们需要O(n * Y)空间来记住整个事情)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅使用集合中的数字查找等于或大于给定目标的总和 的相关文章

随机推荐

  • 使用一系列角度创建循环列表 python

    我有一个列表列表 其中包含角度集的下限和上限 就像是 1 22 2 24 359 15 360 21 总共360个元素 现在我想检查从 1 到 360 的每个角度 列表中包含该角度的元素 我正在考虑使用下限和上限来创建列表的所有元素rang
  • JAVA NIO Bytebuffer.allocateDirect() 对 int 的大小限制

    我正在尝试制作堆外内存缓冲区 我想要非常大的缓冲区 比如 10GB 我听说jvm堆有时会因为full GC而冻结 所以 我尝试用 java nio ByteBuffer 制作缓冲区 但是 我遇到了很大的困难 java nio ByteBuf
  • Stata:变量中相同值连续出现的最大次数

    我的数据集中的观察结果是玩家和二进制变量temp1如果玩家采取了行动 则 up 等于 1 否则等于 0 我想计算每个玩家的最大连续移动次数 simulation playerlist temp1 temp2 temp3 temp4 temp
  • Code::阻止详细构建

    我想查看发送到的实际命令g 在 Code Blocks 构建期间 我想确切地了解它在编译和链接步骤中使用的命令行参数 并且我不想在构建设置 GUI 中进行操作 或者 将 Code Blocks 项目转换为等效的 Makefile 也可以 但
  • 通过 REST API 的 Cosmos DB IN 子句

    我无法使用以下方式制定搜索查询INAzure Cosmos 文档 DB 的子句 Query query SELECT FROM LOADS l WHERE l schedulingSystem in schedulingSystem par
  • 如何向量化矩阵的行对角化

    我有一个 n m 矩阵 我想将其转换为 mn m 矩阵 结果的每个 m m 块包含每行的对角线 例如 如果输入是 1 2 3 4 5 6 输出应该是 1 0 0 2 3 0 0 4 5 0 0 6 当然 我不想自己一步步组装矩阵for lo
  • 谷歌云python sdk安装错误-SSL证书错误

    尝试在 Windows 10 上为所有用户安装 Google Cloud SDK Python 出现以下错误 这是新机器并开始全新建造 在此之前安装了python 2 7版本 请帮我解决这个问题 输出文件夹 C Program Files
  • Go Template ParseFiles 函数解析多个文件

    如果我将两个或多个文件传递给 Go Template 的 ParseFiles 函数会发生什么 func Template ParseFiles 它有帮助说 ParseFiles 解析命名文件并将结果模板与 t 相关联 如果发生错误 则解析
  • 对从托管代码创建的事件的 WaitForSingleObject 的访问被拒绝

    如何在 C 中创建命名事件对象 以便我可以在单独的 C 进程中等待它 我的流程 A 的简化 C 代码 EventWaitHandle evt new EventWaitHandle false EventResetMode AutoRese
  • Rails 5 - 使用多态关联 - 渲染视图

    我正在尝试学习如何在 Rails 5 应用程序中使用多态关联 我最近问this问题 但我对其进行了多次编辑以显示我正在尝试的所有内容 它已经变得混乱 我有名为 组织 提案 和 包 Bip 的模型 这些协会是 组织 has many bips
  • Android:如果同时请求 GPS 和网络,网络提供商将无法工作

    if gps enabled locationManager requestLocationUpdates LocationManager GPS PROVIDER 0 0 locationListenerGps if network en
  • iOS 应用程序通过 USB 电缆连接与 OSX 中运行的应用程序进行通信

    iOS SDK 是否提供了一种方法让 iOS 应用程序通过 USB 电缆连接与 OSX Windows 中运行的应用程序通信 或者 套接字是唯一的选择 如果您想通过 USB 与 iOS 中的 OS X 程序交互 PeerTalklib 似乎
  • 在 Android 上解析 SHOUTcast 7.html 元数据

    我正在尝试使用以下 URL 检查 SHOUTcast 流的状态 http 85 17 167 136 8684 7 html 返回如下数据 7 1 77 100 7 128 44 0 7908 340 811 Follow Us visio
  • 如何在 SQL Management Studio 中指定不同的端口号?

    我正在尝试连接到不在端口 1433 上的 Microsoft SQL 2005 服务器 使用 SQL Management Studio 连接到服务器时如何指示不同的端口号 127 0 0 1 6283 ip和端口之间添加逗号
  • ASP.NET 的自定义文件扩展名 - 需要帮助!

    我的 Apache 2 2 服务器上运行了 modaspdotnet 因此它可以很好地运行 ASP NET 和 MySQL 但是 我想做的是提供具有其他扩展名的内容 而不仅仅是默认的 aspx 例如myfile customextensio
  • Android,当我使用应用内更新时发生InstallException

    Google I O 2019 新增应用内更新 所以我尝试按照文档使用它 https developer android com guide app bundle in app updates 但它发送了一个 InstallExceptio
  • vue中无法使用插件

    我想在浏览器中管理cookie并使用这个外部插件vue cookies 但是如果我在某个 vue 文件中调用它的方法 this cookies get 我会在浏览器中收到错误 TypeError Cannot set property co
  • 为 ARM 编写的原生 Android 代码如何在 x86 上运行?

    摩托罗拉刚刚发布了一款基于 x86 的 Android 手机 我有点困惑为 ARM 编写的本机应用程序 库 例如 netflix 如何在这款手机上运行 如果有人可以解释 我将不胜感激 是的 ARM 本机代码在 Intel x86 上运行 使
  • 使 java 方法仅对特定类可见

    我有一个管理器类 负责管理某种类型的对象 为此 它需要操作这些对象 但这些对象与管理器没有任何关系 因此从技术上讲 它们位于单独的包 project managers 和 project objects 中 重要的是 所讨论的对象只能由管理
  • 仅使用集合中的数字查找等于或大于给定目标的总和

    示例1 商店里卖啤酒 有6瓶和10瓶的 客户输入 26 算法回复 26 因为 26 10 10 6 示例2 销售香料 可用包为 0 6 1 5 和 3 目标值 5 算法返回值 5 1 因为它是比包 3 1 5 0 6 可能实现的目标最接近的