算法基础系列第五章——动态规划之背包问题(2)

简介: 算法基础系列第五章——动态规划之背包问题(2)

多重背包


例题描述——暴力解法版本

微信图片_20221018142922.jpgDP分析法


多重背包问题和完全背包是很像的,完全背包问题中,物品是有无限件,但是多重背包中,对物品的数量进行了限制。微信图片_20221018142956.jpg

参考代码(C++版本)


例题描述——二进制优化微信图片_20221018143109.jpg

从道题的数据范围可以知道,假如直接暴力的话,1000 ∗ 2000 ∗ 2000 1000*2000*20001000∗2000∗2000 = 40亿,C++ 一秒大概是算107 ~ 108次,所以暴力是一定会超时的。


二进制优化的引入


倘若有个物品的个数S SS,S = 1023 S = 1023S=1023,想表示这个S SS,首先可以想到的是从0开始枚举到1023。但是很明显这种效率很低。

假如使用打包的想法,每个包裹中物品的个数依次是1 11、2 22、4 44、8 88、16 1616、… … 、512 512512。那么,使用这十个包裹,就可以拼凑出0~1023中的任意数,比如7,就使用包裹中物品个数为1+包裹中物品个数为2+包裹中物品个数为4的三个包裹。


二进制优化实例分析


倘若S SS= 200了?,继续按照2的整次幂进行划分

1 ,2,4,8,16,32,64,X XX。现在比较棘手的是最后一个包裹中物品的个数,它可以是128吗?假如是128,咱们从1累加到128,得到的是255,但是咱们只有200个物品,是凑不出来255的。

从1加到64是127,还差73。因此,当我们X XX补成73的时候,1到64是可以凑出0~127中的任意数,0到127中的任意拼法加上73,就可以凑出73到200中任意数,整合起来,咱们确实可以凑出从0到200中任意数。


咱们需要注意的是对X XX的限制,X XX是必须严格小于2k+1

微信图片_20221018143223.jpg

具体的流程落实

微信图片_20221018143307.png

参考代码(C++版本)


分组背包


例题描述

微信图片_20221018143420.jpg

DP分析法


分组背包最主要的特点是关注选哪个组的第几个物品。微信图片_20221018143450.jpg

因为只能选择一个,就可以用分析01背包的方式进行分析了,只是在选择某组的第非0个物品时候,要具体落实到第几组的第几个物品,比如第i ii组的第k kk个物品


参考代码(C++版本)


总结


相关文章
|
5天前
|
数据采集 监控 算法
应用动态规划算法解决可转债软件中的最优买卖时机问题
使用动态规划算法解决可转债市场的最佳买卖时机问题。定义状态dp[i][0](持有可转债的最大利润)和dp[i][1](不持有可转债的最大利润),通过状态转移方程更新状态,以max函数求解。提供的Python代码示例展示了如何计算最大利润。将此算法集成到软件中,结合网络爬虫获取实时价格,自动计算并提供买卖建议,助力投资者做出更明智的决策。
33 0
|
19天前
|
机器学习/深度学习 存储 算法
数据结构与算法 动态规划(启发式搜索、遗传算法、强化学习待完善)
数据结构与算法 动态规划(启发式搜索、遗传算法、强化学习待完善)
17 1
|
19天前
|
算法
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
36 1
|
19天前
|
算法
算法系列--动态规划--特殊的状态表示--分析重复子问题(下)
算法系列--动态规划--特殊的状态表示--分析重复子问题(下)
17 0
|
19天前
|
算法
算法系列--动态规划--特殊的状态表示--分析重复子问题(上)
算法系列--动态规划--特殊的状态表示--分析重复子问题
20 0
|
19天前
|
算法
算法系列--动态规划--背包问题(5)--二维费用背包问题(下)
算法系列--动态规划--背包问题(5)--二维费用背包问题(下)
15 0
|
19天前
|
算法
算法系列--动态规划--背包问题(5)--二维费用背包问题(上)
算法系列--动态规划--背包问题(5)--二维费用背包问题(上)
22 0
|
19天前
|
算法
算法系列--动态规划--背包问题(4)--完全背包拓展题目(下)
算法系列--动态规划--背包问题(4)--完全背包拓展题目(下)
23 0
|
19天前
|
算法
算法系列--动态规划--背包问题(4)--完全背包拓展题目(上)
算法系列--动态规划--背包问题(4)--完全背包拓展题目(上)
21 0
|
3天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于DCT变换和位平面分解的数字水印嵌入提取算法matlab仿真
这是一个关于数字水印算法的摘要:使用MATLAB2022a实现,结合DCT和位平面分解技术。算法先通过DCT变换将图像转至频域,随后利用位平面分解嵌入水印,确保在图像处理后仍能提取。核心程序包括水印嵌入和提取,以及性能分析部分,通过PSNR和NC指标评估水印在不同噪声条件下的鲁棒性。