【题解】洛谷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://www.pswp.cn/web/95469.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95469.shtml

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

相关文章

数据结构_循环队列_牺牲一个存储空间_不牺牲额外的存储空间 Circular Queue(C语言实现_超详细)

目录循环队列的引出区别普通队列和循环队列两种循环队列的概念循环队列深入理解题目&#xff1a;此题&#xff0c;分为牺牲一个额外空间和不牺牲一个额外空间不牺牲一个额外空间完成第一步完成第二步完成第三步完成第四步牺牲一个额外空间完成第一步完成第二步完成第三步完成第…

Linux_网络基础

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;LInux_st 小伞的主页&#xff1a;xiaosan_blog 制作不易&#xff01;点个赞吧&#xff01;&#xff01;谢谢喵&#xff01;&a…

Portainer:Docker可视化管理神器部署与使用攻略

Portainer是一款优秀的Docker可视化管理工具&#xff0c;它提供了简洁美观的Web界面&#xff0c;可以通过点击鼠标轻松管理Docker环境。 一、Portainer简介 Portainer是一个轻量级的Docker管理界面&#xff0c;具有以下特点&#xff1a; 可视化操作&#xff1a;通过Web界面管…

OVITO3.13.1_ Mac中文_材料科学、物理及化学领域设计的数据可视化和分析软件_安装教程

软件下载 【名称】&#xff1a;****OVITO3.13.1Mac中文 【大小】&#xff1a;****154M 【语言】&#xff1a;简体中文 【安装环境】&#xff1a;****mac 【网站下载链接】&#xff1a; https://a-xing.top/3008.html软件应用 软件应用 Ovito能做什么&#xff1f; Ovito的功能十…

MySQL 开发避坑:DROP TABLE 前你必须知道的几件事

MySQL 中删除表主要使用 DROP TABLE 语句。这是一个需要非常谨慎的操作&#xff0c;因为一旦执行&#xff0c;表结构和表中的所有数据都会被永久删除。1. 基本语法&#xff1a;删除单个表sqlDROP TABLE [IF EXISTS] table_name;* DROP TABLE: 核心命令&#xff0c;用于删除表…

浅谈人工智能之阿里云搭建coze平台

浅谈人工智能之阿里云搭建coze平台 一、部署环境准备 阿里云服务器配置要求 ○ 规格&#xff1a;最低2核CPU 4GB内存&#xff08;推荐4核8GB保障流畅运行&#xff09;&#xff0c;作者原先想要利旧&#xff0c;使用了2核2GB的服务器&#xff0c;但是跑不起来&#xff0c;后来自…

ego(2)---初始轨迹生成后的关键点采样

在初始的多项式轨迹生成后&#xff0c;是要经过一个关键点采样&#xff0c;使用关键点来进行后续的 B 样条曲线拟合的。即&#xff1a;初始多项式拟合->关键点采样->B样条拟合关键点采样的思路关键点采样使用时间步长 ts 来在初始轨迹方程中取点。在上一步的初始轨迹生成…

专项智能练习(信息安全防护措施)

3.以下属于网络安全威胁的是&#xff08;A &#xff09;。 A.非授权访问、病毒感染、信息泄露、拒绝网络服务 B.信息泄露、非授权访问、病毒感染、硬盘损坏 C.信息篡改、非授权访问、病毒感染、硬盘损坏 D.网络异常、非授权访问、信息篡改、病毒感染 解析本题考查网络安全威胁。…

ubuntu编译webrtc库

一. 前言 本文介绍在 ubuntu 下如何通过 webrtc 源码编译出指定版本 webrtc.lib 库&#xff08;以 m94 版本为例&#xff09;。 二. 编译步骤 1. 下载depot_tools工具 depot_tools 是 Google 用来管理大型项目代码&#xff08;例如 WebRTC&#xff09;的工具集&#xff0c;它…

基于ZooKeeper实现分布式锁(Spring Boot接入)及与Kafka实现的对比分析

在分布式系统中,多节点对共享资源的并发访问往往会引发数据一致性问题,分布式锁正是解决这一问题的核心组件。本文将从原理出发,详细讲解基于ZooKeeper实现分布式锁的完整流程,提供Spring Boot接入的可运行代码,并深入对比其与Kafka实现分布式锁的异同点及优缺点,帮助开发…

Shell 三剑客之 awk 命令详解(理论+实战)

目录 一、前言 二、工作流程总览 三、最常用内置变量 四、命令格式 五、20 个高频实战案例 5.1 基础打印 awk {print "hello"} < /etc/passwd 所有行打印成hello awk {print} test6.txt 打印test6.txt文件 awk {print $1} test6.txt 默认以空格为分割&am…

一个真正跨平台可用的免费PDF解决方案

在整理资料时&#xff0c;常需将不同格式的文件统一转为PDF格式&#xff0c;确保排版不乱、便于长期保存和打印 它的功能全面&#xff0c;支持批量操作&#xff0c;使用非常方便&#xff1a;只需把PDF文件拖进界面&#xff0c;选择目标格式&#xff0c;无论PDF转换成Word、PDF…

强化微调:以Swift框架进行GRPO多模态模型强化微调为例

一、TL&#xff1b;DR 整体介绍&#xff1a;强化微调RFT的原因、步骤、作用以及常见的rft方式dmeo举例&#xff1a;以Swift给的Qwen2.5-Math-7B-Instruct为例介绍了整个RFT的流程和代码细节实际强化微调&#xff1a;以qwen/internVL为例完成一次指令微调并且使用强化学习进一步…

时序数据:使用关系数据库 vs 时序数据库存储的核心区别是什么?

一、时序数据使用关系数据库 vs 时序数据库存储的核心区别 时序数据&#xff08;Time Series Data&#xff09;是指随时间连续产生的数据&#xff08;如传感器读数、服务器指标、交易记录等&#xff09;&#xff0c;其核心特点是高频写入、时间有序、量大且查询模式集中于时间范…

ansible判断

ansible判断 一、判断运算符 “” “!” “>” “<” “>” “<” “and” “or” “not” is in 每次执行完一个任务&#xff0c;不管成功与失败&#xff0c;都会将执行的结果进行注册&#xff0c;可以使用这个注册的变量来判断 when&#…

接口设计标准化流程,结合RESTful最佳实践和实际开发经验,涵盖从需求分析到部署的全过程

目录一、接口设计流程二、需求分析阶段1. 功能需求2. 非功能性需求三、接口设计规范四、详细实现步骤1. 选择Web框架2. 接口路由设计3. 请求参数定义4. 请求参数验证5. 业务逻辑分层6. 错误处理机制7. 异步任务处理8. 安全策略9. 接口文档10. 测试策略11. 服务部署11.1 生产环境…

LeetCode 1023.驼峰式匹配

给你一个字符串数组 queries&#xff0c;和一个表示模式的字符串 pattern&#xff0c;请你返回一个布尔数组 answer 。只有在待查项 queries[i] 与模式串 pattern 匹配时&#xff0c; answer[i] 才为 true&#xff0c;否则为 false。 如果可以将 小写字母 插入模式串 pattern 得…

【IQA技术专题】 无参考自然图像IQA:NIQE

无参考自然图像IQA&#xff1a;NIQE&#xff1a;Making a “Completely Blind” Image Quality Analyzer&#xff08;2012 IEEE&#xff09;专题介绍一、研究背景二、NIQE方法2.1 NSS model2.2 Patch Selection2.3 Characterizing Image Patches2.4 Multivariate Gaussian Mode…

变位齿轮:分度圆、节圆与中心距的 “特殊关联”

接着上回的话题&#xff0c;在标准齿轮中&#xff0c;我们追求的是“节圆与分度圆重合”的理想状态。但当实际工程提出更苛刻的要求时&#xff0c;比如&#xff1a;需要避免齿轮根切&#xff08;齿数过少时&#xff09;。要配凑一个非标准的中心距。需要大幅提高小齿轮的强度和…

Spring Boot集成Kafka常见业务场景最佳实践实战指南

一、基础集成与核心组件解析 &#xff08;一&#xff09;环境搭建与依赖配置 在 Spring Boot 项目中集成 Kafka&#xff0c;首先需通过 Maven 添加核心依赖&#xff1a; <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>…