从不同组中选择的背包

2024-03-25

我对背包问题有一个变体,我正在努力寻找有效的解决方案。

假设您有多组项目。每个组可以有任意数量的物品,每个物品都有一个值和重量。问题是找到总价值最大、重量

也就是说,想象一下你有数百种物品可供选择,但你必须带一份三明治、一份饮料、一份零食、一只手电筒等。不仅你不能从任何一组中拿走多于一件,而且你必须至少拿走一件。如果有 g 个组,那么一天结束时总共会得到 g 个项目。

看起来这应该比基本问题更快,因为很多组合都是无效的,但我正在努力寻找解决方案。


C++ 中的示例代码。该函数返回可实现的最大值,或者-1如果不存在可行的解决方案。它运行在O(n * max_weight) where n是计算所有组的项目总数,并且max_weight是重量限制。其复杂度本质上与解决原始背包问题的经典算法相同。该代码实现了 Evgeny Kluev 答案中的算法。

int CalcMaxValue(const std::vector<std::vector<int>>& weight,
                 const std::vector<std::vector<int>>& value,
                 int max_weight) {
    std::vector<int> last(max_weight + 1, -1);
    if (weight.empty()) return 0;
    for (int i = 0; i < weight[0].size(); ++i) {
        if (weight[0][i] > max_weight) continue;
        last[weight[0][i]] = std::max(last[weight[0][i]], value[0][i]);
    }
    std::vector<int> current(max_weight + 1);
    for (int i = 1; i < weight.size(); ++i) {
        std::fill(current.begin(), current.end(), -1);
        for (int j = 0; j < weight[i].size(); ++j) {
            for (int k = weight[i][j]; k <= max_weight; ++k) {
                if (last[k - weight[i][j]] < 0) continue;
                current[k] = std::max(current[k], last[k - weight[i][j]] + value[i][j]);
            }
        }
        std::swap(current, last);
    }    
    return *std::max_element(last.begin(), last.end());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从不同组中选择的背包 的相关文章

  • 如何使用KDTrees实现最近邻搜索?

    所以 我正在实施一个KD Tree http en wikipedia org wiki Kd tree进行最近邻搜索 我已经构建了树部分 但我认为我没有完全理解搜索部分 关于遍历树来搜索邻居 维基百科文章如下 Starting with
  • 两个非嵌套循环的大 O 表示法

    对于两个非嵌套的 for 循环 大 O 表示法是什么 Example for int i 0 i
  • 如何计算两个ip之间的主机数量? C#

    我有两个ip 1 1 1 1 1 2 4 4 4 4 显然这只是一个例子 这是一个动态计算器 如果子网掩码不相关 我如何计算所述 ip 之间的主机数量 要计算 理论 IP 地址的数量 您需要将每个 IP 地址转换为其 32 位整数格式 这实
  • 如何动态查找连接组件

    使用不相交集数据结构可以很容易地得到图的连通分量 而且 它只是支持增量连接组件 http www boost org doc libs 1 46 1 libs graph doc incremental components html 然而
  • 合并字符数组中的最小重复次数

    假设我有两个数组 我想合并它们 以便合并后的数组具有最小重复次数 例如 x x 是重复 arr1 x d d m f m arr2 d d x f f m 唯一的条件是在合并数组中 元素来自arr1 and arr2必须出现在各自的订单中a
  • cordova 使用什么 js“引擎”?

    Cordova 使用什么 JS 引擎 它是特定于平台的还是跨所有平台的一个标准 意味着 iOS 的 safari 和 Android 的 chrome 以及 Windows 可能的 IE 标准 或者跨所有平台的 Cordova JS 引擎
  • 从日志文件中获取前 100 个 URL

    我的一位朋友在接受采访时被问到以下问题 谁能告诉我如何解决它 我们有一个相当大的日志文件 大约 5GB 日志文件的每一行都包含一个用户在我们网站上访问过的 URL 我们想要找出用户访问最多的 100 个 URL 怎么做 如果我们有超过 10
  • 编程 Pearls - 随机选择算法

    Programming Pearls 第一版第 120 页介绍了从 N 个整数总体中选择 M 个等概率随机元素的算法 InitToEmpty Size 0 While Size lt M do T RandInt 1 N if not Me
  • 通过分布式数据库聚合作业优化网络带宽

    我有一个分布式 联合数据库 结构如下 数据库分布在三个地理位置 节点 每个节点集群有多个数据库 关系数据库是 PostgreSQL MySQL Oracle 和 MS SQL Server 的混合体 非关系数据库是 MongoDB 或 Ca
  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • 如何将无向图转换为 DAG?

    The 维基页面 http en wikipedia org wiki Directed acyclic graph Relation to other kinds of graphs says 任何无向图都可以通过为其顶点选择总顺序并将每
  • 我需要一个支持高效随机访问和 O(k) 插入和删除的容器

    我再次尝试问同样的问题question https stackoverflow com questions 3808708 delete parts of a dynamic array and grow other 但我最终提出了一个不同
  • 找到一系列间隔的最有效分组

    我有一个应用程序 其中有一系列不重叠的固定宽度间隔 每个间隔都有一个给定的键 每个间隔具有相同的宽度 并且可以存在连续的间隔 本质上 我想以最小化单独间隔的数量的方式对间隔和键进行分组 这可以通过合并具有相同键的连续间隔或查找匹配间隔并将它
  • 时间复杂度和运行时间有什么区别?

    时间复杂度和运行时间有什么区别 它们是一样的吗 运行时间是指程序运行所需的时间 时间复杂度是对输入大小趋于无穷大时运行时间渐进行为的描述 您可以说运行时间 是 O n 2 或其他什么 因为这是描述复杂性类和大 O 表示法的惯用方式 事实上
  • 无需构建树即可预测霍夫曼压缩比

    我有一个二进制文件 我知道其中每个符号出现的次数 如果我要使用霍夫曼算法压缩它 我需要预测压缩文件的长度 我只对假设的输出长度感兴趣 而不对单个符号的代码感兴趣 因此构建霍夫曼树似乎是多余的 作为一个例子 我需要得到类似的东西 包含 4 个
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 数组中连续元素的最大乘积

    我在现场面试的时候被问到了这个算法问题 由于没有要求我签署保密协议 我将其发布在这里寻求答案 给定一个数组REAL不包含 0 的数字 找到产生最大乘积的连续元素 该算法应在线性时间内运行 我考虑过以下方法 使用两个数组 第一个是利用DP思想
  • 分而治之策略来确定列表中是否有超过 1/3 的相同元素

    我正在使用分治算法来确定列表中是否有超过 1 3 的元素相同 例如 1 2 3 4 不 所有元素都是唯一的 1 1 2 4 5 是的 其中 2 个是相同的 没有排序 是否有分而治之的策略 我陷入了如何划分的困境 def is valid i
  • 用 C++ 生成 AST

    我正在用 C 制作一个解释器 到目前为止我已经有了词法分析器来生成标记 问题是我不确定如何生成 行走 解析树 我正在考虑使用数组数组来制作解析树 但我不确定如何以正确的顺序将标记实际插入到解析树中 我不确定是自上而下 左右还是自下而上 左右
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两

随机推荐

  • 如何删除由 addEventListener 以事件对象作为参数绑定的匿名函数

    例如 document addEventListener keyup function ev if ev ctrlKey dosomething false 有什么办法可以去掉匿名函数吗 你可以自己写一个小接口addEventListene
  • tinymce 4 如何添加事件处理程序

    在tinymce 3中 我们似乎可以这样做 Adds a click handler to the current document tinymce dom Event add document click function e conso
  • Angular:延迟加载模块重新加载时重置服务状态

    我的申请中关于服务的结构如下 AppModule AppComponent and HomeComponent Lazy1 Lazy2 Lazy3 我的应用程序从 AppComponent 开始 它重定向到 HomeComponent 然后
  • 正则表达式不以数字开头

    如何创建一个匹配所有开头不带数字的字母数字的正则表达式 现在我有 0 9 a zA Z0 9 例如 1ab 不匹配 ab1 匹配 1 bc 不匹配 bc 1 匹配 你所写的内容存在三处错误 首先 要否定一个字符类 您可以将 inside括号
  • 雪花中有保存或加载工作表的选项吗?

    雪花中有保存或加载工作表的选项吗 或者将工作表下载到本地并从本地加载 我的意思不是通过剪贴板将其粘贴到某些文本编辑器并保存这样的选项 Snowflake 会自动保存您的工作表 您还可以将脚本从本地加载到工作表 但是无法下载工作表 Saved
  • QOpenGLWidget显示黑屏

    我尝试了此处描述的 QOpenGLWidget 示例 https stackoverflow com a 31524956 4564882 https stackoverflow com a 31524956 4564882 但我只得到一个
  • 使用IDLE时的工作目录是什么?

    所以 我正在学习 Python 想创建一个简单的脚本来从互联网下载文件 然后将其写入文件 但是 我正在使用 IDLE 并且不知道 IDLE 中的工作目录是什么或如何更改它 如果我不知道工作目录或如何更改它 如何在 IDLE 中执行文件系统操
  • 如何识别“hw.machine”标识符可靠?

    我正在寻找最官方的来源来完成 维护此方法 NSString platformString NSString platform self platform if platform isEqualToString iPhone1 1 retur
  • 如何获取 Woocommerce 电子邮件通知中的 cookie 值?

    我正在使用 php cookie 从插件检索 woocommerce 感谢页面和客户订单详细信息页面的值 它在感谢页面上工作正常 但没有在电子邮件订单详细信息页面上打印任何内容 我该如何解决此问题 我尝试过使用 php 会话获取值 它仅打印
  • itextsharp - 阅读 1 列(第 1 页)和 2 列(第 2 页)的 PDF 时出现问题

    当打开首页上只有一列而其他页面上有超过一列的 PDF 文件时 我的下面的代码丢失了 有人可以告诉我我做错了什么吗 下面是我的代码 PdfReader pdfreader new PdfReader pathNmArq ITextExtrac
  • 如何在 Paw 中执行并发 HTTP 请求?

    在 Paw 中 如果我有一个长时间运行的请求并尝试调用另一个请求 则会出现一个对话框 其中显示Stop request A request is currently running 与选项Cancel Stop and Stop Send
  • 重新连接到网络后如何获取有效的 Firebase appcheck 令牌?

    我在我的 Android 应用程序中使用 Firebase appcheck 它工作得很好 只是如果我在飞行模式下启动应用程序然后禁用飞行模式 即模拟在没有网络连接的情况下打开应用程序 然后获得网络连接 它总是会失败 当我没有连接时 我会反
  • 使用 ARMAResult.predict() 函数的正确方法

    根据这个问题如何使用 statsmodels 和 Python 获得 AR 模型中的常数项 https stackoverflow com questions 24172454 how to get constant term in ar
  • 如何在 macOS 上更改 sourcetree 中 github 帐户的用户名密码?

    我正在使用 SourceTree 并拥有 2 个 GitHub 帐户 我连接并将我的提交推送给其中之一 第一次 SourceTree 要求我输入密码 但是当我想推送到我的其他 GitHub 帐户时 它不会要求我输入密码 只是显示此错误 我找
  • 列,宽度参数不起作用

    我在工作中运行 REHL7column V at column from util linux 2 23 2 我有 csv 文件 其中包含一些带有长字符串的列 我想将 csv 作为表格查看 并限制列宽 因为我 通常对抽查长字符串不感兴趣 c
  • 如何使用 zlib 压缩字符串并恢复字符串?

    我正在尝试利用 Zlib 进行文本压缩 例如我有一个字符串T blah blah blah blah 我需要压缩这个字符串 我在用S zlib compress T 来压缩它 现在我想要的是得到非二进制形式S这样我就可以解压T但在不同的程序
  • 从另一个应用程序中自动安装/卸载应用程序

    我正在开发 Android 设备管理服务 其功能之一是指定应在服务的注册设备上安装哪些应用程序 该场景是 经理将企业应用程序上传到该服务 以便在其员工的 Android 设备上使用 然后 他要求服务部署该应用程序 该服务与设备上预安装的应用
  • 手机关机和开机后,无声通知如何表现

    我有一个应用程序尝试在某些情况下使用静默通知来获取用户的位置 我能够向手机发送静默通知 并能够运行后台获取并将位置返回到网络服务 比较静默通知的用户负载 当应用程序处于后台 挂起模式时 我正在执行一些操作 启动位置管理器并从委托方法中获取位
  • 使用 Bootstrap 进行电子邮件模板设计[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我必须创建一个响应式电子邮件模板设计 我已经设计了一段时间 但从未有机会创建电子邮件模板 我可以使用 Bootstrap 创建电子邮件
  • 从不同组中选择的背包

    我对背包问题有一个变体 我正在努力寻找有效的解决方案 假设您有多组项目 每个组可以有任意数量的物品 每个物品都有一个值和重量 问题是找到总价值最大 重量 也就是说 想象一下你有数百种物品可供选择 但你必须带一份三明治 一份饮料 一份零食 一