多重背包之单调队列优化:

若用F[j]表示对容量为j的背包,处理完前i种物品后,背包内物品可达到的最大总价值,并记m = min(n, j / v)。放入背包的第i种物品的数目可以是:0、1、2……,可得:

F[j] = max { F[i - 1] [j – k * v ] + k * w } (0 <= k <= m) ㈠

如何在O(1)时间内求出F[j]呢?

先看一个例子:取m = 2, v = v, w = w, V > 9 * v,

并假设 f(j) = F[i - 1][j],观察公式右边要求最大值的几项:

j = 6v: f(6v)、f(5v)+w、f(4v)+2w 这三个中的最大值

j = 5v: f(5v)、f(4v)+w、f(3v)+2w 这三个中的最大值

j = 4v: f(4v)、f(3v)+w、f(2v)+2 * w 这三个中的最大值

显然,公式㈠右边求最大值的几项随j值改变而改变,但如果将j = 6 * v时,每项减去6*w,j=5 * v时,每项减去5 * w,j=4 * v时,每项减去4 * w,就得到:

j = 6 * v: f(6 * v)-6 * w、f(5 * v)-5 * w、f(4 * v)-4 * w 这三个中的最大值

j = 5 * v: f(5 * v)-5 * w、f(4 * v)-4 * w、f(3 * v)-3 * w 这三个中的最大值

j = 4 * v: f(4 * v)-4 * w、f(3 * v)-3 * w、f(2 * v)-2 * w 这三个中的最大值

很明显,要求最大值的那些项,有很多重复。

根据这个思路,可以对原来的公式进行如下调整:

假设d = v,a = j / d,b = j % d,即 j = a * d + b,代入公式㈠,并用k替换a - k得:

F[j] = max { F[i - 1] [b + k * d] - k * w } + a * w (a – m <= k <= a) ㈡

对F[i - 1][y] (y= b b+d b+2d b+3d b+4d b+5d b+6d … j)

F[j]就是求j的前面m + 1个数对应的F[i - 1] [b + k * d] - k * w的最大值,加上a * w,如果将F[j]前面所有的F[i - 1][b + k * d] – k * w放入到一个队列,那么,F[j]就是求这个队列最大长度为m + 1时,队列中元素的最大值,加上a * w。因而原问题可以转化为:O(1)时间内求一个队列的最大值。

#如未理解公式推导,可用k的范围代入公式以加深理解。当然刷题是必不可少的的?。

多重背包单调队列优化思路_多重背包之单调队列优化理论性总结相关推荐

  1. 多重背包单调队列优化思路_多重背包问题

    题目描述: 无优化版本: int main(){int m, n;cin >> n >> m;for(int i = 1; i <= n; ++i){int v , w, ...

  2. 多重背包单调队列优化思路_动态规划入门——多重背包与单调优化

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第14篇文章,也是动态规划专题的第三篇. 在之前的文章当中,我们介绍了多重背包的二进制拆分的解法.在大多数情况下,这种 ...

  3. sql并发 锁 优化思路_并发优化–减少锁粒度

    sql并发 锁 优化思路 在高负载多线程应用程序中,性能非常重要. 开发人员必须意识到并发问题才能获得更好的性能. 当我们需要并发时,我们通常拥有必须由两个或更多线程共享的资源. 在这种情况下,我们处 ...

  4. oracle 10g 速度慢,让Oracle跑得更快—Oracle 10g性能分析与优化思路_数据库教程

    资源名称:让Oracle跑得更快-Oracle 10g性能分析与优化思路 内容简介: 在这本书里读者将会学到作者在性能优化方面的一些思路和思考,一些故障处理的方法和原则,这些东西是作者在实践中长期积累 ...

  5. mysql优化要点_你需要掌握的 Mysql 优化的一些要点

    本文是学习<高性能 Mysql>中关于 Mysql 中查询优化需要注意的一些要点的总结: Schema 和数据类型优化尽量避免使用 NULL 值,尤其存在索引时,因为如果 NULL 列是索 ...

  6. 队列的基本操作_算法设计:数据结构-队列

    一.队列 1.队列的概念 队列是一种"先进先出(first in first out)"的数据结构,它是一种有序线性表的抽象数据类型.队列在计算机 领域的应用也相当的广泛,例如计算 ...

  7. 创建队列 c语言_在C中创建队列

    创建队列 c语言 A queue in C is basically a linear data structure to store and manipulate the data elements ...

  8. python贝叶斯优化算法_自动调参——贝叶斯优化算法hyperopt

    注:转载请注明出处. 本篇文章主要记录了贝叶斯优化算法hyperopt的学习笔记,如果想看自动化调参中的网格调参和遗传优化算法TPOT,请查看我另外两篇文章:网格搜索gridSearchCV和遗传优化 ...

  9. SPN实现——限时1000ms的代换-置换网络加解密的时间优化思路

    SPN实现--限时1000ms的代换-置换网络加解密的时间优化思路 题目简介 SPN密码体系 课本样例 问题分析 AC代码 优化方法 最后 2021.9 HUSTOJ 密码学课程设计第一题--时间优化 ...

最新文章

  1. Extjs4.0 开发笔记-desktop开始菜单动态生成方法
  2. WebP图片格式,压缩提高28%
  3. 《基于张量网络的机器学习入门》学习笔记6
  4. 2021-03-01 英文写作中的“许多”
  5. 反思不可佛系:刺激身体 刺激神经 目标反馈 定量奖惩 注重氛围
  6. win定时关机_怎么让电脑定时关机,有多种办法
  7. 十分漂亮的视频源码解析
  8. 抽象类与抽象方法 c# 1613720553
  9. 3DMax2015的下载和安装
  10. CodeForces 1305C-Kuroni and Impossible Calculation(抽屉原理)
  11. 使用两个FBO互相绑定实现PS液化效果
  12. 蓝牙耳机什么牌子好?性价比最高的蓝牙耳机排行榜
  13. 苏宁易购账户莫名消失 个人信息泄露并非个例
  14. 工业虚拟现实解决方案
  15. 微信微博让人焦虑烦躁,怎么办?
  16. 2020电子设计大赛E题复盘
  17. 计算机连接打印机用户数量修改,使用注册表修改对打印机进行设置的方法
  18. GooglePlay OAuth使用
  19. 周大福向北京体育大学教育基金会捐赠1.2亿元设立“郑家纯冠军培养基金”
  20. 江阴php工程师_江阴市融媒体中心(江阴传媒集团)招人啦!

热门文章

  1. php 连接mysql 错误排查一例
  2. 2016企业开发趋势:Lightbend关于JVM开发者的调查
  3. 提取网页中的链接并生成xml
  4. oracle存储过程、声明变量、for循环(转)
  5. Leetcode: Reorder List
  6. 微信公众平台开发(58)自定义菜单
  7. 繁星代码生成器0.91版 【视频】
  8. The request sent by the client was syntactically incorrect. 错误以及spring事物
  9. docker 报错 non-overlapping IPv4 address pool among the defaults to assign to the network 解决方法
  10. cpu meltdown 熔断 漏洞 突破内存独立性限制 简介