算法基础系列第五章——动态规划之背包问题(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++版本)


总结


相关文章
|
2月前
|
机器学习/深度学习 存储 算法
动态规划算法深度解析:0-1背包问题
0-1背包问题是经典的组合优化问题,目标是在给定物品重量和价值及背包容量限制下,选取物品使得总价值最大化且每个物品仅能被选一次。该问题通常采用动态规划方法解决,通过构建二维状态表dp[i][j]记录前i个物品在容量j时的最大价值,利用状态转移方程避免重复计算子问题,从而高效求解最优解。
400 1
|
2月前
|
算法 搜索推荐 Java
贪心算法:部分背包问题深度解析
该Java代码基于贪心算法求解分数背包问题,通过按单位价值降序排序,优先装入高价值物品,并支持部分装入。核心包括冒泡排序优化、分阶段装入策略及精度控制,体现贪心选择性质,适用于可分割资源的最优化场景。
238 1
贪心算法:部分背包问题深度解析
|
9月前
|
存储 算法 Java
算法系列之动态规划
动态规划(Dynamic Programming,简称DP)是一种用于解决复杂问题的算法设计技术。它通过将问题分解为更小的子问题,并存储这些子问题的解来避免重复计算,从而提高算法的效率。
348 4
算法系列之动态规划
|
10月前
|
算法 Java C++
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
301 5
|
9月前
|
算法 安全 调度
【动态规划篇】穿越算法迷雾:约瑟夫环问题的奇幻密码
【动态规划篇】穿越算法迷雾:约瑟夫环问题的奇幻密码
|
9月前
|
机器学习/深度学习 算法 测试技术
【动态规划篇】01 背包的逆袭:如何用算法装满你的 “财富背包”
【动态规划篇】01 背包的逆袭:如何用算法装满你的 “财富背包”
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
558 2
动态规划算法学习三:0-1背包问题
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
245 2
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
240 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
|
23天前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
142 0

热门文章

最新文章