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

多重背包单调队列优化思路_多重背包的单调队列优化

分析了几种多重背包的常见算法.

多重背包的问题形式

有 $n$ 个物品,其中第 $i$ 个物品的体积是 $v_i$ ,价值是 $w_i$ ,有 $c_i$ 个.

现在有一个容量为 $m$ 的背包,需要选出若干个物品放入背包中,满足它们体积和不超过 $m$ ,最大化价值总和.

朴素算法

设 $f(i,j)$ 表示考虑了前 $i$ 种物品,选出物品总体积不超过 $j$ 时的最大价值.

$$

f(i,j)=\max_{k=0}^{k\cdot v_i\le j} \lbrace f(i-1,j-k\cdot v_i+k\cdot w_i) \rbrace

$$

枚举 $i,j,k$ 进行转移,时间复杂度 $O(nm\max c_i)$ .

二进制拆分

对每个物品,从小到大枚举 $k$ ,若 $c_i\ge 2^k$ ,就从 $c_i$ 中拿出 $k$ 个形成以一个新物品,体积是 $v_i\cdot 2^k$ ,价值是 $w_i\cdot 2^k$.

若最后 $c_i$ 还有剩下的,就将这 $c_i$ 个组合成一个新物品.

用这些新物品代替原来的 $c_i$ 个物品,对所有新物品做一个 $01$ 背包,容易证明和原问题是等价的.

时间复杂度 $O(nm\log \max c_i)$ .

单调队列优化

观察朴素算法的转移形式,

$$

f(i,j)=\max_{k=0}^{k\cdot v_i\le j} \lbrace f(i-1,j-k\cdot v_i+k\cdot w_i) \rbrace

$$

固定 $i$ ,可以发现一个 $f(i-1,j)$ 只会被用于更新 $f(i,j+k\cdot v_i)$ ,而 $v_i$ 是确定的.

于是我们可以将所有 $f(i-1,j)$ 按照模 $v_i$ 的结果分成若干组,每组分别去更新 $f(i)$ .

考虑 $j\bmod v_i=r$ 的这一组,它们也只能更新 $j\bmod v_i=r$ 的 $f(i.j)$ .

那么我们可以直接把 $j$ 写成 $pv_i+r$ 的形式,这组内的转移式就可以写为

$$

f(i,pv_i+r) = \max \lbrace f(i-1,(p-k)v_i+r)+k\cdot w_i\rbrace,k\le c_i

$$

那么 $p-k$ 的合法选择范围就是一个长度固定的后缀的形式,随着 $p$ 增大不断向后滑动.

这就是一个滑动窗口的最优化 dp 了,可以用单调队列进行优化.

时间复杂度 $O(nm)$ .

相关文章:

  • 印章QQ头像
  • xcorr函数原理_matlab中的xcorr 自相关函数
  • IT == 网管?
  • android finish 判断当前_最常用的Activity的onBackPressed()与finish()的区别.
  • 一切艺术与伟业的奥妙——专心!
  • axis1 c# 接口 调用_Tomcat6.0+Jdk1.5+Axis1.3搭建java webservice环境,并使用c#调用该服务。...
  • 开发基于ASP.NET的自定义日志系统
  • mysql 几级缓存_mysql缓存:一级缓存和二级缓存
  • HTTP 1.1与HTTP 1.0的比较
  • mysql 中一个表里有父子关系_SQLAlchemy - 同一个表中的父子关系
  • c mysql锁_mysql三种锁
  • 文献管理软件使用[keep updating]
  • The 25 Worst Tech Products of All Time
  • 电脑mac地址会变吗_怎么查询电脑mac地址
  • mysql 以非root启动_非root权限安装mysql启动问题
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • flutter的key在widget list的作用以及必要性
  • hadoop集群管理系统搭建规划说明
  • JSONP原理
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Promise面试题,控制异步流程
  • React-redux的原理以及使用
  • Tornado学习笔记(1)
  • vagrant 添加本地 box 安装 laravel homestead
  • XML已死 ?
  • 第2章 网络文档
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 高程读书笔记 第六章 面向对象程序设计
  • 前端性能优化--懒加载和预加载
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 深度学习入门:10门免费线上课程推荐
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 与 ConTeXt MkIV 官方文档的接驳
  • 如何在招聘中考核.NET架构师
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #pragma multi_compile #pragma shader_feature
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (区间dp) (经典例题) 石子合并
  • (十三)Flask之特殊装饰器详解
  • (十三)Maven插件解析运行机制
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • .htaccess 强制https 单独排除某个目录
  • .Net 4.0并行库实用性演练
  • .net core Swagger 过滤部分Api
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net mvc actionresult 返回字符串_.NET架构师知识普及