OI 中的背包问题

news/2025/3/19 19:52:46/文章来源:https://www.cnblogs.com/max0810/p/18781192

OI 中的背包问题

2025.3.18 🍏讲课记录

01 背包

无价值

给定 \(n\) 个物品,每个物品的体积为 \(c_i\),求能否选出一些物品,使得体积和为 \(m\)

\(c = \max c_i\)

  • bitset 优化普通背包,时间复杂度为 \(\mathcal{O}(\frac{nm}\omega)\)
  • 分治 FFT,即将每个物品看成一个多项式 \(x^{c_i}+1\),然后全部卷起来,时间复杂度 \(\mathcal{O}(nc\log^2 n)\)

以上两个做法都可以求出所有 \(m\in [0,\sum c_i]\) 时的答案。然后下面是一个经典做法:

我们先从前往后加入物品,在满足体积和 \(\le m\) 的情况下一直加,假设加了前 \(p\) 个物品,则 \(\sum\limits_{i=1}^p c_i\in [m-c,m]\)。(特判掉所有物品体积和都不超过 \(m\) 的情况)

那么对于最终的答案,一定是在现在的方案上删除一些物品,加入一些物品。那么一定存在一种加删的方式,使得物品的体积和一直保持在 \([m-c,m+c]\) 中。因为可以考虑在当前体积和 \(\le m\) 时就加入物品,否则就删除。

我们设 \(f_{i,j,x}\) 表示考虑了前 \(i\) 个物品,只能删除编号 \(>j\) 的物品(即编号 \(\in[j+1,p]\),也相当于不动前 \(j\) 个物品),能否凑出来体积和为 \(x\),其中 \(x\in[m-c,m+c]\)。我们发现 \(j\) 更小限制一定是更宽的,所以对于特定的 \(i,x\)\(f_{i,j,x}\) 一定是一段前缀为 \(1\),后缀为 \(0\),那么可以记录这个分界点,设 \(g_{i,x}\) 表示考虑了前 \(i\) 个物品,凑出体积和为 \(x\) 的所有方案中,最多能不动前多少个物品。那么有转移:

  1. 不选当前的物品:\(g_{i,x}\larr g_{i-1,x}\)
  2. 加入当前物品,显然 \(j\) 不变:\(g_{i,x+c_i}\larr g_{i,x}\)
  3. 删除前 \(j\) 个物品中的一个,\(\forall j\in [1,g_{i,x}],g_{i,x-c_j}\larr j-1\)

那么最后答案就是 \(g_{n,m}\) 是否非空。但是这样子转移的时间复杂度为 \(\mathcal{O}(n^2c)\) 的,没有优化。

我们发现,每次枚举的 \(j\) 不用这么多,因为 \(g_{i-1,x}\le g_{i,x}\),而在第 \(i\) 位枚举的 \(j\in[1,g_{i,x}]\) 中,所有 \(j\in[1,g_{i-1,x}]\) 已经在 \(i-1\) 中枚举过了,因此只需要枚举 \(j\in (g_{i-1,x},g_{i,x}]\) 中的值来做转移即可。那么对于同一个 \(x\),枚举量只有 \(\mathcal{O}(n)\),总复杂度为 \(\mathcal{O}(nc)\)

这个做法还能求出体积和不超过 \(m\) 的情况下,体积和最大是多少。

例题:Subset Sum - Problem

有价值

给定 \(n\) 个物品,第 \(i\) 个物品体积为 \(w_i\),价值为 \(v_i\),你需要选出一些物品,体积和不超过 \(m\),求最大价值和。

\(w = \max w_i,v = \max v_i\)。首先有复杂度为 \(\mathcal{O}(nm)\) 的暴力。

做法一

跟无价值的做法类似,先找到一个断点 \(p\),使得 \(\sum\limits_{i=1}^p w_i\in [m-w,m]\),然后直接选前 \(p\) 个物品,并将这 \(p\) 个物品的体积和价值取反,这样还是相当于 \(n\) 个物品的背包。根据经典结论,任意一个随机的和为 \(0\) 的由 \(1,-1\) 构成的序列中,前缀最大值期望为 \(\mathcal{O}(\sqrt n)\)

于是我们先将 \(n\) 个物品随机打乱,做背包的时候只需记录体积和在 \([m-\sqrt nw,m+\sqrt nw]\) 的状态即可。为了提高正确率可以适当扩大点区间。时间复杂度为 \(\mathcal{O}(n\sqrt nw)\)

似乎第一步选物品时先按性价比排序再选,那么前缀最大值最多为 \(\mathcal{O}(w\sqrt w)\)。(尚未证明,但这样做正确率应该会高点)

做法二

将同一体积的物品一起加入,设 \(f_{i,x}\) 表示加入了体积为 \([1,i]\) 的物品,体积和 \(\le x\) 的最大价值。

如果当前体积 \(i\) 选了 \(j\) 个,那么一定选的是体积为 \(i\) 的物品中价值最大的 \(j\) 个,假设价值和为 \(g_{i,j}\),那么转移为:\(f_{i,x+ik}\larr f_{i-1,x}+g_{i,j}\)

我们将 \(f_{i-1,x}\)\(x\bmod i\) 分类,每一类内部是做一个 \(\max+\) 卷积,因为 \(g_i\) 是凸的,所以有决策单调性,那么每次做是 \(\mathcal{O}(m\log m)\),总时间复杂度为 \(\mathcal{O}(wm\log m)\)。但是这个做法非常慢,基本被第一个做法偏序。

完全背包

无价值

给定 \(n\) 类物品,第 \(i\) 类物品体积为 \(c_i\),有无限个,求是否能选出一些物品,使得体积和为 \(m\)

\(c=\max c_i,g = \gcd(c_i)\),如果 \(g\nmid m\),那么肯定不行。然后可以发现,如果 \(m\) 足够大,那么肯定可以凑出。根据裴蜀定理,这个界为 \(\mathcal{O}(w^2)\)。那么当 \(m\) 不够大时,有以下做法。另 \(z=\min c_i\),设 \(f_{i,x}\) 表示考虑了前 \(i\) 个物品,\(\bmod z = x\) 的体积中能凑出来的最小的体积和是多少。因为有无限个体积为 \(z\) 的物品,所以所有 \(\ge f_{i,x}\)\(\bmod z = x\) 的体积和都可以凑出来。

初始化为 \(f_{0,0} = 0\),当加入第 \(i\) 个物品时,有转移 \(f_{i,(x+c_i)\bmod z}\larr f_{i-1,x}+c_i\),这个时候可以看成一张 \(z\) 个点的图,然后从 \(0\) 开始跑最短路。或者使用转圈:考虑在 \(f_{i-1}\rarr f_{i}\) 的转移时,按照 \(\bmod \gcd(c_i,z)\) 分类,每一类的转移是一个环,那么从一个点开始转两圈更新即可。容易发现这一定会覆盖到所有转移。

继续分析上界,你会发现这张图一共有 \(z\) 个点,每条边权长度 \(\le c\),于是到每个点的最短路 \(\le zc\),于是有上界 \(zc\)

有价值

给定 \(n\) 类物品,第 \(i\) 类物品体积为 \(w_i\),价值为 \(v_i\),有无限个,你需要选出一些物品,体积和不超过 \(m\),求最大价值和。

咕咕咕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901673.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Amphion 推出合成音频鉴别系统 Auditi;Gemini 引入 NotebookLM 功能,生成文档、网页音频摘要丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

洛谷题单指南-图论之树-P3398 仓鼠找 sugar

原题链接:https://www.luogu.com.cn/problem/P3398 题意解读:一颗n个节点的树,m个判断,判断树上两条路径是否相交,相交输出Y,否则输出N 解题思路:此题需要画一棵多叉树来辅助判断多次观察相交的路径,可以得出一个关键性质: 两条路径相交,必然有一条路径的LCA在另一条…

lg 主页

\(\Large\text{My Blog}\)中学:济南天山高级实验中学 关于我的学校究极久远预告:寒假游记滚滚长江东逝水,浪花淘尽英雄 是非成败转头空 青山依旧在,几度夕阳红 白发渔樵江渚上,观看秋月春风 一壶浊酒喜相逢 古今多少事,都付笑谈中街喧闹,人过往 且记曾相识,莫为少年留 …

day:25 selenium之介绍和环境配置

一、selenium介绍 selenium是一个第三方库,python有很多库; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。 2、ui自动化的优点? (1)解决重复性的功能测试和验证 (2)减少测试人员在回归测试时用例漏测和验证点的漏测 (3…

[算法学习记录] [更新中]最短路

顾名思义,最短路算法,就是求一个图中所有的点距某一个点的最短距离,常见的有Dijkstra算法、Bellman-Ford算法、Johnson算法与Floyd算法。 Dijkstra Dijistra算法实际上是一种由贪心与动态规划结合的算法,我们每次都贪心地选择到某个点的最近距离,又动态地更新着距离数组d的…

day6-static静态变量

静态变量/静态方法 被static修饰 工具类静态方法不能调用非静态。 非静态可以访问所有。 继承一个子类只能继承一个父类,可以多层继承,最大的父类为Objectcoding 练习:更好的方法:双指针不浪费空间

SpringBoot引入JWT实现用户校验

一JWT JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传输信息。这些信息以JSON对象的形式存储在令牌中,并且可以被签名和加密。JWT通常用于身份验证和信息交换主要用途 身份验证:当用户登录成功后,服务器会生成一个JWT并返回给客户端。之后…

mcp-playwright测评

mcp-playwright介绍 mcp-playwright是一个使用 Playwright 提供浏览器自动化能力的模型上下文协议服务器。该服务器使 LLMs 能够与网页交互、截屏,并在真实的浏览器环境中执行 JavaScript。 GitHub地址:https://github.com/executeautomation/mcp-playwright。安装 npm insta…

传媒行业项目管理全解析:日事清在流程、文件、数据与风控中的一体化应用

一、关于森可文化 森可文化传媒有限公司(Senke Vision)占据了超过2800平方米的宽敞办公及拍摄场地,与众多内衣及服饰行业的上市巨头建立了不可动摇的深度合作关系。 Senke Vision汇聚了国内外顶尖的策划、设计、摄影摄像、服装搭配、化妆及品牌视觉顾问,形成了一支独一无二…

在 .NET 项目中使用 husky 完成 pre-commit 操作

将 husky 引入 .NET 项目Husky 是一个用于 Git 仓库的工具,主要用于管理 Git 钩子(hooks)。它可以帮助开发者在特定的 Git 操作(如提交、推送等)之前或之后执行自定义的脚本或命令,从而提高代码质量和团队协作效率。 主要用在前端项目中,可以通过 Husky.Net,将 Husky 的…

贸易企业数字化转型案例:基于日事清的目标管理、任务协作与流程可视化绩效优化实践

这家贸易公司如何提升内部协同效率?一、基本情况 所属行业:传统贸易行业 业务类型:国内贸易、货物及技术进出口 行业地位:拥有自己的研发人员,具备一站式解决方案能力。 合作概要:为解决组织提效,目标体系、协同体系、绩效体系的管理问题,客户与日事清达成合作,并将日…

使用nvm管理node.js版本

1.情景展示如上图所示,项目某个模块支持的node.js最高版本是17,我用的是20,所以只能降级。 2.具体分析 我现在把node.js降到16,那后续如果再需要20呢?能不能实现版本的随时切换? 3.安装nvm 我们可以使用nvm来管理node.js的版本。 下载nvm windows下载地址:https://githu…