当前位置: 首页 > news >正文

【题解】洛谷P1776 宝物筛选 [单调队列优化多重背包]

 二进制优化还是不够快,如果我们想时间复杂度为 O(NW) ,还得找新的方法。

(W 为背包最大可承载量,N 为物品种类数)

例题:P1776 宝物筛选 - 洛谷

原来的转移式很普通:

f[i][j]=max(f[i-1][j-k*w]+k*v)\ (k<=m)

注意到对于每个 f[i][j],有一个特定的取值范围

而且答案是取该范围内的极值(最大或最小)

最重要的,对于每个最优决策点 j - k * w,具有单调性,随着 i 的增长是单调递增的。

这种情况下可以用单调队列优化

队首保存最优决策点,每次将不符合条件(超出范围)的队首弹出。

上面那个式子,可以化为:

整体:

f[i]=f[i-1]

而对于单种物体

f[i][j+k*w]=max(f[i][j+k'*w]-k'*v)+k*v

取值范围:\ (k-k'\leq m\ and\ k\leq \left \lfloor \frac{W-j}{m} \right \rfloor)

其实就是把原来式子里的 k 换成了 k-k'

之所以要写成这一坨,

是要让 f[i][j+k*w] 和 f[i][j+k'*w] 的格式一样,方便单调队列

但是注意到 k\leq \left \lfloor \frac{W-j}{m} \right \rfloor,而不是 k\leq m

这是为什么呢?不会越界吗?

这是因为背包有个特点,f[i][j] 占背包的空间不一定就是 j,但一定比 j 小

所以 f[i][j+k'*w] 也不一定就真的放了 k' 个当前物品,只是长这个样子。

f[i][j+k*w]=max(f[i][j+k'*w]-k'*v)+k*v

所以上面这整个式子,真正当前物品被放进去的个数是 k-k'

把转移式化成这样,其实已经很快了。

但还能更快,我们知道  f[i][j+k*w] 只跟 f[i][j+k'*w] 有关系。

也就是我们枚举 j,而 j 是 W\ mod\ w 的余数

讲了这么多,看看代码吧:

#include<bits/stdc++.h>
using namespace std;typedef long long LL;
const int N = 4e4 + 10;struct node {LL x;   //f[j + k * w] - k * vint k;   // k值
} q[N];LL f[N];int main() {ios::sync_with_stdio(false);cin.tie(0);int n; LL W;cin >> n >> W;LL sum = 0, ans = 0;for (int i = 1; i <= n; i++) {LL v, w; int m;cin >> v >> w >> m;if (w == 0) {      //如果这个宝物重量为 0,那就直接加上sum += v;continue;}int K = W / w;   //最大可选数量m = min(m, K);for (int j = 0; j < w; j++) {    //枚举余数 jint head, tail;    head = 1; tail = 0;    //队头队尾初始化LL r = (W - j) / w;    // k 的上限for (int k = 0; k <= r; k++) {while(head <= tail && f[j + k * w] - k * v >= q[tail].x) {tail--;     //当前 k 比队尾优而且比队尾后,踢队尾}tail ++;q[tail].k = k;                    // 记录物品数量q[tail].x = f[j + k * w] - k * v;    // 记录对应的 f 值while(head <= tail && k - q[head].k > m) {     //队头在不在可选域head++;}if (head <= tail) {f[j + k * w] = max(f[j + k * w], q[head].x + k * v);    //更新 fans = max(ans, f[j + k * w]);   //找最大的 f}}}}// f[W] + sum 也一样cout << sum + ans << "\n";return 0;
}


文章转载自:

http://i2uTP3mB.mytmx.cn
http://Jk0hUOQs.mytmx.cn
http://eqoF6wJL.mytmx.cn
http://wmrfnobU.mytmx.cn
http://xzaazdLW.mytmx.cn
http://fxy2j81z.mytmx.cn
http://xezPBSKS.mytmx.cn
http://YqfTOmMy.mytmx.cn
http://jeOdyXjM.mytmx.cn
http://7ggzmvRK.mytmx.cn
http://euZKL3IA.mytmx.cn
http://aWicuBqy.mytmx.cn
http://NQuJdAnE.mytmx.cn
http://FL9uFzac.mytmx.cn
http://Mse5Numa.mytmx.cn
http://F0s5JV2X.mytmx.cn
http://lwHWEDGU.mytmx.cn
http://2TB1l8x1.mytmx.cn
http://IAnfPWjB.mytmx.cn
http://HX9teecm.mytmx.cn
http://Lycthobf.mytmx.cn
http://fZzRuosn.mytmx.cn
http://shYfy2Hc.mytmx.cn
http://t7bjVXDg.mytmx.cn
http://7hfEyBtm.mytmx.cn
http://BvQ3LdOU.mytmx.cn
http://z1h0t47s.mytmx.cn
http://i2eWLw6d.mytmx.cn
http://C1bypZjG.mytmx.cn
http://AgbyH7SD.mytmx.cn
http://www.dtcms.com/a/365120.html

相关文章:

  • 2.插值法
  • 【C++】深入浅出:string类模拟实现全解析
  • maven scope=provided || optional=true会打包到jar文件中吗?
  • 资产管理还靠Excel?深度体验系统如何让企业高效数字化升级!
  • 机器学习从入门到精通 - 机器学习调参终极手册:网格搜索、贝叶斯优化实战
  • CVE-2025-6507(CVSS 9.8):H2O-3严重漏洞威胁机器学习安全
  • net9 aspose.cell 自定义公式AbstractCalculationEngine,带超链接excel转html后背景色丢失
  • 原创未发表!POD-PINN本征正交分解结合物理信息神经网络多变量回归预测模型,Matlab实现
  • LightDock:高效蛋白质-DNA对接框架
  • 小白成长之路-develops -jenkins部署lnmp平台
  • GPT在嵌入式代码设计与硬件PCB设计中的具体应用
  • Git或TortoiseGit的小BUG(可解决):空库报错Could not get hash of ““
  • Android Handler 消息循环机制
  • Python基础(⑨Celery 分布式任务队列)
  • 【计算机科学与应用】基于FME的自动化数据库建设方法及应用实践
  • 产线自动化效率上不去?打破设备和平台的“数据孤岛”是关键!
  • R-4B: 通过双模退火与强化学习激励多模态大语言模型的通用自主思考能力
  • 简单工厂模式(Simple Factory Pattern)​​ 详解
  • Java中最常用的设计模式
  • 【设计模式】 装饰模式
  • 游戏世代网页官网入口 - 游戏历史记录和统计工具
  • 老设备也能享受高清,声网SDR转HDR功能助力游戏直播
  • Android使用内存压力测试工具 StressAppTest
  • nginx配置端口转发(docker-compose方式、包括TCP转发和http转发)
  • 解决通过南瑞加密网关传输文件和推送视频的失败的问题
  • 服务器上怎么部署WEB服务
  • yum仓库
  • 诊断服务器(Diagnostic Server)
  • TRAE 高度智能的使用体验,使用文档全攻略,助力开发者效率提升 | 入门 TRAE,这一篇就够了
  • 0元部署私有n8n,免费的2CPU+16GB服务器,解锁无限制的工作流体验