一类特殊背包问题

news/2024/12/20 19:05:21/文章来源:https://www.cnblogs.com/dcytrl/p/18619847

题意

\(n\) 个物品,体积 \(v_i\) 价值 \(w_i\),做 01 背包,\(n\le 10^6,m\le 5\times10^4,v_i\le 300\)

原题忘了叫啥了。

分析

发现 \(v_i\) 非常小,考虑把物品按照体积分类,逐类处理。

对于体积为 \(i\) 的物品,我们肯定要按照价值从大到小取。将这些物品排序做前缀和,设选前 \(i\) 大的数的和为 \(s_i\),则 \(s_i\) 是上凸的。

显然有转移 \(f_j=\max(f_j,f_{j-k\times i}+s_k)\)。不难发现转移中下标模 \(i\) 不同的状态是独立的,所以我们可以考虑按照模 \(i\) 的余数进一步分类处理,那么转移方程可以写成 \(f'_j=\max(f'_j,f'_{j-k}+s_k)\),由于 \(s_k\) 是一个上凸函数,其满足四边形不等式“交叉大于包含”,所以 \(f'_j\) 的转移具有决策单调性(简证:\(s_{k+1}-s_k<s_k-s_{k-1}\rightarrow 2s_k>s_{k-1}+s_{k+1}\)),可以分治解决。时间复杂度 \(O(mv\log m)\)

代码:

int n,m;
int k;
i64 f[maxm],g[maxm],h[maxm];
vector<int>v[maxn];
vector<i64>s;
void solve(int l,int r,int L,int R,const int id){if(l>r)return;int mid=(l+r)>>1;i64 res=0;int p=mid;rep(i,max(L,mid-(int)v[id].size()),min(R,mid-1)){i64 ret=g[i]+s[mid-i-1];if(ret>res)res=ret,p=i;}h[mid]=res;if(l==r)return;solve(l,mid,L,p,id),solve(mid+1,r,p,R,id);
}
inline void solve_the_problem(){n=rd(),m=rd();rep(i,1,n){int x=rd(),y=rd();v[x].emplace_back(y);}rep(i,1,w)if(!v[i].empty()){sort(all(v[i]),greater<int>());s.assign(v[i].size(),0);s[0]=v[i][0];rep(j,1,(int)v[i].size()-1)s[j]=s[j-1]+v[i][j];rep(d,0,i-1){k=0;reprange(j,d,m,i)g[++k]=f[j];solve(1,k,1,k,i);rep(j,1,k)ckmx(f[(j-1)*i+d],h[j]);}}rep(i,1,m)ckmx(f[i],f[i-1]);rep(i,1,m)write(f[i],32);
}

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

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

相关文章

实用工具:Calibre 7.22最新版 一款Window电子书管理工具和阅读器便携版

📢提示:文章排版原因,链接放在文章结尾👇👇,往下翻就行 📢提示:文章排版原因,链接放在文章结尾👇👇,往下翻就行 前言 初识Calibre 最近有几本epub格式的电子书要看发现电脑上没有可以打开的软件,所以最近找到了这个软件。功能 功能亮点电子书管理:Calib…

VS2022 C++QT 中文乱码 设置UTF-8编码

说明 所有内容来源于网络 通过插件调整源文件编码FileEncoding:查看编码 Force UTF-8:用于保存为UTF-8 C++项目设置为utf-8 项目-属性-配置属性-C/C++-命令行-其它选项 中 增加/utf-8、

雷池 WAF 配置了多条人机验证规则,命中规则是怎样的?

优先级说明 频率限制(1 小时) > 自定义规则(1 小时) > 站点 BOT 防护(自定义时长) 配置人机验证的地方 【防护配置-频率限制】限制结果选择【人机验证】【防护配置-自定义规则】规则类型选择【人机验证】【防护站点-站点管理】的【BOT 防护】中开启【人机验证】命中…

如何在C#.NET中使用LINX(arduino的LabView库)

思路:使用LabView的导出为.NET互操作程序集,导出COM给.NET调用在LabView安装HubMaker插件,将预编译固件刷入Arduino设备中。这不是本文的重点,省略 根据需要,编写VI。注意:必须在此处使用全局变量或者其它方法避免LinxResource簇在C#中出现,否则在程序运行时有概率出现堆…

C#.Net NModbus库 简单代码案例(非Nmodbus4库)

在NuGet管理器中搜索NModbus。注意,如果需要使用串口通信需要同时选中相关包

EyeSoothe荣登中国区“健康健美”类第32名! ✨

眼睛疲劳、视力变化、色盲检测、虚拟眼镜试戴……这些问题,EyeSoothe都能帮你解决!作为一款全能眼健康应用,EyeSoothe集成了多个强大功能,旨在帮助你更好地保护视力,缓解眼部疲劳,随时关注眼健康。📱💡 https://apps.apple.com/app/eyesoothe/id6478070048 为什么选择…

腾讯云 AI 代码助手:代码诊断应用实践

代码诊断是指通过分析和检查源代码,发现并定位其中的错误、缺陷或不规范之处。传统的代码诊断方法主要依赖于人工审查和简单的静态分析工具,结合流水线的自动化能力并且结合质量门禁建立不同的质量阈值关卡。基于 AI 赋能代码诊断是在传统的能力基础上在次进行质量左移,通过…

虚拟机下centos7系统实现修改ip地址为固定ip

修改虚拟机配置 目的 如果不修改虚拟机配置,会出现设置了静态IP和相关参数之后,本地局域网可以互相访问,但是CentOS系统访问不了互联网。 步骤一:以管理员身份打开虚拟机 步骤二:打开虚拟网络编辑器 左上角菜单栏找到“编辑”选项并单击,在下拉子菜单中单击选项“虚拟网络…

【每日一题】20241220

事情总是这样。一个人竭尽全力想要置身事外,但忽然有一天,不知道为什么,却发现自己身处某个故事之中,一路奔向结局。【每日一题】 1.(16分) \(\hspace{0.7cm}\)如图,\(ABD\) 为竖直平面内的光滑绝缘轨道,其中 \(AB\) 段是水平的,\(BD\) 段为半径 \(R=0.2 \; \mathrm{m…

保障飞行安全:飞机起落架收放系统的挑战与突破

飞机起落架是飞机结构中的重要承力构件,是完成起飞、着陆、滑行和停放等操作的核心装置,其工作性能直接关系到飞机的飞行安全和运行效率。在现代航空领域,为了提高飞行速度、减小飞行阻力以及优化航程性能,起落架在飞行过程中需要收起,以减少空气阻力;在飞机着陆前又必须…

记~vue3中ColorThief的介绍与使用

安装 npm i colorthief效果 代码<template><div><img ref="image" src="@/assets/img/no-message.png" alt="示例图片"><button @click="getColorPalette">获取颜色</button><div>主色调</di…

Springboot2.x升级到3.x的经验分享

背景 随着Spring 各种漏洞的更新发布,springboot升级到3.x迫在眉睫。 2.x升级到3.x是一次大的跨越,以下内容是升级时需要注意的一些地方。 JDK的变化 Spring Boot 3.0.0 需要 Java 17或更高版本,下载地址Java Archive Downloads,根据自己的系统版本选择下载即可。 JDK版本说…