一道很好的单调队列优化多重背包入门题

令\(v[i]\)表示重量,\(w[i]\)表示价格 ,\(c[i]\)表示最多可放的数量,不难推出朴素的转移方程如下:

$f[i][j]=max\{f[i-1][j-k*v[i]]+k*w[i]\},j-k*v[i]\geqslant 0$
但这样时间复杂度太高了,令$r=j\%v[i],s=\left \lfloor \frac{j}{v[i]} \right \rfloor$考虑给转移方程变形为:
$f[i][j]=max\{f[i-1][r+k*v[i]]-k*w[i]\}+s*w[i],s-c[i]\leqslant k\leqslant s$
这个转移方程同样是正确的,并且我们发现取$max$的那一部分,在$r$确定的情况下,只跟$k$的值有关,于是我们就可以用单调队列优化啦。枚举$i$,$r$之后,对于每一个$r$我们开一个单调队列,扫一遍就好了
时间复杂度$O(nV)$
坑点:重量为$0$的物品要直接累加到答案中!
代码如下(懒得用滚动数组):
``` cpp
#include

using namespace std;

int n, m, zero, v[(int)1e5], w[(int)1e5], c[(int)1e5], f[105][(int)2e5];

struct S { //习惯开结构体QwQ

int id, w;

}q[(int)2e5];

int main() {

cin >> n >> m;

for(int i = 1; i <= n; ++i) cin >> w[i] >> v[i] >> c[i];

for(int i = 1; i <= n; ++i) {

if(!v[i]) { //处理重量为0的物品

zero += w[i]c[i];

continue;

}

for(int r = 0, h = 0, t = 0; r < v[i]; ++r, h = t = 0) //h,t记得清零

for(int j = r, s = 0; j <= m; j += v[i], ++s) {

while(h < t && q[t-1].w < f[i-1][j]-s
w[i]) --t; //--维护

q[t++] = S{s, f[i-1][j]-sw[i]}; //--队列

while(h < t && q[h].id < s-c[i]) ++h; //--单调性

f[i][j] = q[h].w+s
w[i];

}

}

cout << zero+f[n][m];

return 0;

}

洛谷P1776 宝物筛选的更多相关文章

  1. 洛谷P1776 宝物筛选_NOI导刊2010提高(02)

    P1776 宝物筛选_NOI导刊2010提高(02) 题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了, ...

  2. 洛谷p1776宝物筛选

    宝物筛选 多重背包问题 物品数目已知 可以枚举每个物品 当做01背包来做 不过会超时 此时需要二进制拆分来优化 分解成新的物品 再跑一遍01背包即可 //二进制拆分+01背包 //设f[j]表示前i件 ...

  3. 洛谷P1776 宝物筛选 题解 多重背包

    题目链接:https://www.luogu.com.cn/problem/P1776 题目大意: 这道题目是一道 多重背包 的模板题. 首先告诉你 n 件物品和背包的容量 V ,然后分别告诉你 n ...

  4. 洛谷P1776 宝物筛选_NOI导刊2010提高(02)(多重背包,单调队列)

    为了学习单调队列优化DP奔向了此题... 基础的多重背包就不展开了.设\(f_{i,j}\)为选前\(i\)个物品,重量不超过\(j\)的最大价值,\(w\)为重量,\(v\)为价值(蒟蒻有强迫症,特 ...

  5. 洛谷 P1776 宝物筛选(多重背包)

    题目传送门 解题思路: 可以转化成0-1背包来做,但暴力转化的话,时间不允许.所以就用了一个二进制划分的方法,将m个物品分成2,4,8,16,32......(2的次方)表示,可以证明这些数通过一定组 ...

  6. 背包问题的优化(洛谷1776 宝物筛选_NOI导刊)

    背包型dp,但是没有看清数据范围差点认为是水题了,(然后诡异的拿了20分)标解是:2进制优化,比较简单把每一类物品看做若干个相互独立的物品,放在一个另外的数组里,然后全局跑一边01就可以.主要思想是: ...

  7. P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化

    多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ...

  8. [luogu P1776] 宝物筛选 解题报告(单调队列优化DP)

    题目链接: https://www.luogu.org/problemnew/show/P1776 题目: 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF ...

  9. luogu||P1776||宝物筛选||多重背包||dp||二进制优化

    题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪 ...

随机推荐

  1. java基础知识总结一:

      四种内部类 直接抛出异常 单例模式: 懒汉式单例.饿汉式单例.登记式单例     []关于内部类:  []关于异常: 直接捕捉并抛出异常:不需要给异常添加名字: if(i>10)throw ...

  2. MySQL新参数log_error_verbosity

      在介绍这个参数前,我们先聊聊参数log_warnings.我们知道MySQL中,其中log_error定义是否启用错误日志的功能和错误日志的存储位置,log_warnings定义是否将告警信息(w ...

  3. SQL学习笔记---常用命令

    常用命令 变量 1.声明 declare @变量名 类型,… 2.赋值 1.同时赋值多个变量(可以结合查询) select @变量名=表达式1,表达式2 2.单个赋值(推荐) set @变量名=表达式 ...

  4. centos7中/tmp文件保存天数

    不要在/tmp目录下保存文件,该目录会定期清理文件 /tmp默认保存10天 /var/tmp默认保存30天 配置文件:/usr/lib/tmpfiles.d/tmp.conf 默认配置文件:# Thi ...

  5. VS根据数据库生成实体类

    一.在类库项目上添加新项 二. 三.依次填入数据库连接 选择数据库 就可以生成数据库实体

  6. MFC打印

    映射模式是MFC甚至SDK界面编程第1个难点.打印则是第2个难点.这2个都是历史遗留的设计缺陷.这些缺陷还不至于到bug程度,但却很难用,不易理解. MFC提供2个类来实现打印(预览),具体有CPri ...

  7. spark-2.4.0-hadoop2.7-安装部署

    1. 主机规划 主机名称 IP地址 操作系统 部署软件 运行进程 备注 mini01 172.16.1.11[内网] 10.0.0.11  [外网] CentOS 7.5 Jdk-8.zookeepe ...

  8. Linux Collection:用户管理

    adduser 添加(新建)用户账户 $ sudo adduser username groups 添加组 $ groups username # 查看用户已有的组 $ groups username ...

  9. django url分发,视图,模板回顾

    Django基础轮廓 MTV+controller 一 url分发系统: 1 简单使用 url(r'^articles/2003/$', views.special_case_2003), # spe ...

  10. jdk 环境变量

    1. jdk安装后的目录 2.JAVA_HOME C:\Program Files\Java\jdk1.8.0_172 3.PATH %JAVA_HOME%\bin 4.CLASSPATH .;%JA ...