@Author:Runsen

@Date:2020/9/17

多重背包有三层循环,如果数据非常的大,那么程序就会变得非常悲伤。在多重背包的问题,其实更多的是考查多重背包的二进制优化方法。学习二进制优化方法,对下面的混合背包才能开始。所以一步扣一步的。

二进制优化方法

这个时候我们就需要优化,有一种优化方式叫做二进制优化

二进制是一个非常神奇的进制,譬如说7这个数,分开就是1+2+4(20+21+22)1+2+4(2^0+2^1+2^2)1+2+4(20+21+22)。

进行完二进制拆分之后,这个问题就转化成了零一背包。

下面就是一个二进制解决多重背包的示例,其中items 表示次数,体积 价值。

'''
@Author: Runsen
@WeChat:RunsenLiu
@微信公众号: Python之王
@CSDN: https://blog.csdn.net/weixin_44510615
@Github: https://github.com/MaoliRUNsen
@Date: 2020/9/17
'''def binary_divide(cnt, volume, price):divides = []for i in range(32):# 从0位开始枚举cur = 1 << i# 如果小于枚举值,说明已经拆分完毕了if cnt < cur:# 把剩下的部分打包divides.append((cnt, cnt * volume, cnt * price))breakelse:# 否则继续拆分,打包1 << i个物品cnt -= curdivides.append((cur, cur * volume, cur * price))return divides
# cnt, volume, price 次数,体积 价值
items = [[3, 3, 5], [4, 2, 3], [1, 2, 4]]  #17= 5+3+5+4
volume = 10
dp = [0  for _ in range(volume+1)]
new_items = []
for i in items:# 二进制拆分print(*i)  # [1, 2, 4]=> 1,2,4  new_items.extend(binary_divide(*i))
print(new_items)# 零一背包
for item in new_items:v, p = item[1], item[2]for i in range(volume-v, -1, -1):dp[i + v] = max(dp[i+v], dp[i] + p)
print(dp[-1])[(1, 3, 5), (2, 6, 10), (0, 0, 0), (1, 2, 3), (2, 4, 6), (1, 2, 3), (1, 2, 4), (0, 0, 0)]
17

Runsen接着看原题,输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。

输出格式
输出一个整数,表示最大价值。

数据范围
0<N≤1000
0<V≤2000
0<vi,wi,si≤2000
提示:
本题考查多重背包的二进制优化方法。具体连接如下:https://www.acwing.com/problem/content/description/5/

'''
@Author: Runsen
@WeChat:RunsenLiu
@微信公众号: Python之王
@CSDN: https://blog.csdn.net/weixin_44510615
@Github: https://github.com/MaoliRUNsen
@Date: 2020/9/21
'''
def binary_divide(volume,price,count):divides = []for i in range(32):# 从0位开始枚举cur = 1 << i# 如果小于枚举值,说明已经拆分完毕了if count < cur:# 把剩下的部分打包divides.append((count, count * volume, count * price))breakelse:# 否则继续拆分,打包1 << i个物品count -= curdivides.append((cur, cur * volume, cur * price))return divides
n,v = map(int, input().split())
goods = []
for i in range(n):goods.append([int(i) for i in input().split()])
new_good = []
for i in goods:# 二进制拆分  extend 这里我用append卡了几天。new_good.extend(binary_divide(*i))
dp = [0 for _ in range(v+1)]
for item in new_good:i, j = item[1], item[2]for k in range(v - i, -1, -1):dp[k + i] = max(dp[k + i], dp[k] + j)
print(dp[-1])4 5
1 2 3
2 4 1
3 4 3
4 5 2
[(1, 1, 2), (2, 2, 4), (0, 0, 0), (1, 2, 4), (0, 0, 0), (1, 3, 4), (2, 6, 8), (0, 0, 0), (1, 4, 5), (1, 4, 5)]
10

在这里需要区别extend和append的加入列表取值,具体示例如下所示。

>>> s = []
>>> s.extend([(1, 1, 2), (2, 2, 4), (0, 0, 0)])
>>> s
[(1, 1, 2), (2, 2, 4), (0, 0, 0)]
>>> s[0]
(1, 1, 2)
>>> a = []
>>> a.append([(1, 1, 2), (2, 2, 4), (0, 0, 0)])
>>> a
[[(1, 1, 2), (2, 2, 4), (0, 0, 0)]]
>>> a[0]
[(1, 1, 2), (2, 2, 4), (0, 0, 0)]

为了OFFER,菜鸟的我必须搞懂动态规划系列三个背包问题之多重背包(二进制优化方法)相关推荐

  1. 一文彻底搞懂Mybatis系列(十六)之MyBatis集成EhCache

    MyBatis集成EhCache 一.MyBatis集成EhCache 1.引入mybatis整合ehcache的依赖 2.类根路径下新建ehcache.xml,并配置 3.POJO类 Clazz 4 ...

  2. tcp 二次握手时延_一篇搞懂TCP的三次握手 四次挥手

    TCP的三次握手四次挥手,估计大家都听过.但是真的能把每一步说明白的人比较少.我还记得在之前面试的时候被面试官一顿问,然后一脸懵B... 都是大学没好好上课 ,这篇文章就跟大家讲讲到底这三握四挥是在搞 ...

  3. 这篇能让你搞懂股票买卖系列问题

    写在前面 如果觉得写的还不错,有所收获,记得点个关注和点个赞哟,不胜感激. 股票买卖的这个系列问题早在之前就在LeetCode就刷了一遍了,不过当时因为一些原因,没有总结成一篇博文.后面又陆陆续续遇到 ...

  4. 看图搞懂三极管的三个工作状态/三极管工作原理新讲解

    这篇文章最大的特点是详细分析了使三极管达到饱和导通的条件和方法,以及注意事项,对实际使用中问题的分析和参数的选择还是很有帮助的. 大家都知道三极管是电流控制型元件,三极管工作在放大状态下存在Ic=βI ...

  5. 显微镜下的webpack4:灵魂tapable,终于搞懂钩子系列!

    简介 大家在看webpack源码的时候,有没有感觉像再看天书,似乎没有办法一个文件比如webpack.js从头看到尾.感觉webpack的跳跃性很强,完全不知道程序在运行的时候,发生了什么.完全不清楚 ...

  6. 一文搞懂TCP的三次握手和四次挥手

    目录 1.三次握手 2.四次挥手 3.11种状态名词解析 TCP的三次握手和四次挥手实质就是TCP通信的连接和断开. 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所 ...

  7. 一篇文章搞懂数据仓库:三范式与反范式

    少年易老学难成,一寸光阴不可轻. 目录 一.第一范式 二.第二范式 三.第三范式 四.反范式化 五.范式化设计和反范式化设计的优缺点 5.1 范式化 (时间换空间) 5.2 反范式化(空间换时间) 六 ...

  8. 【深度学习】ToMe:我的方法无需训练即可加速 ViT 模型|搞懂Transformer系列

    作者丨科技猛兽 编辑丨极市平台 导读 这篇文章提出了一种无需训练即可加速 ViT 模型,提高吞吐量的方法 Token Merging (ToMe).ToMe 通过一种轻量化的匹配算法,逐步合并 ViT ...

  9. 电压和电流反馈判别及例子,绝对让你通透,其实也没有那么难,一次就看懂!从此终于搞懂了电压反馈和电流反馈!

    电压和电流反馈判别及例子,其实也没有那么难,绝对让你通透,一次就看懂!从此终于搞懂了电压反馈和电流反馈! 一个简单粗暴的判断方法: 先看反馈是否直接连到Uo输出端(若不是直接从输出端引出,则为电流反馈 ...

最新文章

  1. 软件工程方法论对我们开发软件有多大用处?谈谈你的看法。
  2. 动态规划——最长公共子序列(洛谷P1439)
  3. python unit test_Python Unittest
  4. 服务器查看文件共享记录,服务器共享文件记录
  5. 证书格式简介及不同格式之间的转换方式
  6. redis3.x集群搭建
  7. python 过采样算法_类不平衡数据分类准确率的提升算法smote过采样方法
  8. 关于SIM900A模块的学习心得
  9. java pdf 转图片
  10. unity3d显示c4d材质_C4D入门到精通,没那么难
  11. 在matlab中读取二进制文件
  12. python是高级语言还是低级语言_机械语言/汇编语言/低级语言/高级语言各是指的什么...
  13. 201912月全国计算机二级考试,201912月天津计算机二级报名时间:12月5日-12月7日!附报名入口...
  14. html+css+小图标,HTML+CSS入门 一个简单实用的CSS loading图标
  15. 省选+NOI 第一部分 动态规划DP
  16. simulator相关
  17. 从零开始学Circos绘制圈图(一)
  18. ProcessOn思维导图插入LaTeX数学公式初体验
  19. vue3.2 动态面包屑导航
  20. 冷门小众的二手绝版书生意

热门文章

  1. list中抽出某一个字段的值_使用LINQ获取List列表中的某个字段值
  2. asp按钮跳转页面代码_重磅更新!全新Web编辑页面、编辑规则快速跳转、状态栏变色、富文本再次升级!...
  3. 飞桨 AI Studio 课程学习 可以成为一名优秀的算法工程师
  4. python3协程 queue_使用gevent库+queue模块实现多协程爬虫,提高爬取效率!
  5. centos7.2安装mysql5.7_Centos7.2下使用YUM快速安装MySQL5.7的方法
  6. JMeter:报错(Content type 'text/plain;charset=UTF-8' not supported)
  7. rac下asm管理的表空间-数据文件的重命名
  8. $.each 用break 好像不太灵啊
  9. I2C驱动程序框架probe道路
  10. python 零散记录(三) 格式化字符串 字符串相关方法