代码随想录算法训练营第四十三天 | 01背包问题理论基础、01背包问题滚动数组、416. 分割等和子集

news2024/11/25 22:54:22

背包问题其实有很多种,01背包是最基础也是最经典的,软工计科学生一定要掌握的。


01背包问题

代码随想录

视频讲解:带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经典问题 | 数据结构与算法_哔哩哔哩_bilibili

思路

        直接上动态规划五部曲

1、dp数组及其下标的含义

对于背包问题,有一种写法, 是使用二维数组,即dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少

2.确定递推公式

再回顾一下dp[i][j]的含义:从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。

那么可以有两个方向推出来dp[i][j],

  • 不放物品i:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。(其实就是当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以背包内的价值依然和前面相同。)
  • 放物品i:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值

所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

3.初始化

首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。

再看其他情况。

状态转移方程 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 可以看出i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。

dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。

那么很明显当 j < weight[0]的时候,dp[0][j] 应该是 0,因为背包容量比编号0的物品重量还小。

当j >= weight[0]时,dp[0][j] 应该是value[0],因为背包容量放足够放编号0物品。

4.确定遍历顺序

在如下图中,可以看出,有两个遍历的维度:物品与背包重量

动态规划-背包问题3

那么问题来了,先遍历 物品还是先遍历背包重量呢?

其实都可以!! 但是先遍历物品更好理解

5.举例验证,直接看链接里的吧。

代码
def test_2_wei_bag_problem1():
    weight = [1, 3, 4]
    value = [15, 20, 30]
    bagweight = 4

    # 二维数组
    dp = [[0] * (bagweight + 1) for _ in range(len(weight))]

    # 初始化
    for j in range(weight[0], bagweight + 1):
        dp[0][j] = value[0]

    # weight数组的大小就是物品个数
    for i in range(1, len(weight)):  # 遍历物品
        for j in range(bagweight + 1):  # 遍历背包容量
            if j < weight[i]:
                dp[i][j] = dp[i - 1][j]
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])

    print(dp[len(weight) - 1][bagweight])

test_2_wei_bag_problem1()

01背包滚动数组

代码随想录

视频讲解:带你学透01背包问题(滚动数组篇) | 从此对背包问题不再迷茫!_哔哩哔哩_bilibili

 看链接吧,老是复制粘贴累了。


416.分割等和子集

本题是 01背包的应用类题目

代码随想录

视频讲解:动态规划之背包问题,这个包能装满吗?| LeetCode:416.分割等和子集_哔哩哔哩_bilibili

思路

        就是01背包的应用,背包的大小是总和的一半,遍历每一个物品,看看遍历到最后能不能装满这个背包。

代码(二维版本在链接里)
class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        if sum(nums) % 2 != 0:
            return False
        target = sum(nums) // 2
        dp = [0] * (target + 1)
        for num in nums:
            for j in range(target, num-1, -1):
                dp[j] = max(dp[j], dp[j-num] + num)
        return dp[-1] == target

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1816950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何将jpg图像添加文字并转换成无压缩的dicom图像

操作系统ubuntu 20 安装imagemagick sudo apt install imagemagick 安装dcmtk sudo apt install dcmtk 脚本如下 #!/bin/bash# Font font"/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"# Font size fontsize30# Font color fontcolor"red" conver…

《web应用技术》第十一次作业

1、验证过滤器进行权限验证的原理。 代码展示&#xff1a; Slf4j WebFilter(urlPatterns "/*") public class LoginCheckFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) thro…

数控机床采集网关的应用-天拓四方

随着工业4.0时代的到来&#xff0c;智能制造成为制造业转型升级的重要方向。数控机床作为制造业的核心设备&#xff0c;其数据采集与监控对于提升生产效率、优化生产流程具有重要意义。本案例将介绍数控机床采集网关的应用&#xff0c;通过该网关实现数控机床数据的实时采集、传…

道闸系统怎么录入车牌,停车场道闸车牌输入方法有哪些?

现在智慧停车场管理系统越来越受到重视&#xff0c;停车场道闸系统作为其中的核心组成部分&#xff0c;通过车牌识别技术实现了车辆的快速、准确管理&#xff0c;但在道闸系统初期也存在手动需要录入车牌的工作。本文将详细介绍道闸系统录入车牌的步骤和方法&#xff0c;帮助管…

论文写作革新:AI如何简化你的研究流程?

不知道大家有没有发现&#xff0c;随着人工智能技术的快速发展&#xff0c;AI工具正逐渐渗透到我们日常生活的各个方面&#xff0c;极大地提高了我们的工作和学习效率。无论是AI写作、AI绘画、AI思维导图&#xff0c;还是AI幻灯片制作&#xff0c;这些工具已成为我们不可或缺的…

16 DTLS协议

加密解密基本概念 什么是非对称加密 什么是公钥 这个就是谁都能获得的钥匙什么是私钥 只有一个人能获得 非对称加密就是公钥上的锁&#xff0c;私钥才能打开&#xff0c;私钥上的锁公钥才能打开。比如说就是地下党接头的时候&#xff0c;把一个信息放在盒子里&#xff0c;然…

用映射对比ab俩个数组 , 并把a的参数传递给b

项目背景 : react ant 需求 : 在项目进行表头设置时,根据aaa中的key和bbb中的name对应 , 并将sort值插入到bbb中 其中 a b 结构如下 具体实现 aaa[ { key: "orderNumber", orderNumber: "工单编号", sort: 1 } ... ]bbb [ { name: "orderNumber…

白酒:茅台镇白酒的消费趋势与未来发展

茅台镇&#xff0c;中国白酒的璀璨明珠&#xff0c;以出产品质的白酒而享誉全球。在这片神奇的土地上&#xff0c;云仓酒庄豪迈白酒以其别具一格的酿造工艺和风格特点&#xff0c;成为了市场的宠儿。随着消费市场的不断变化&#xff0c;云仓酒庄豪迈白酒的消费趋势也在悄然发生…

有哪些指标体系搭建模型?五个步骤教你从0开始搭建指标体系

在当今的商业环境中&#xff0c;数据驱动决策已成为企业成功的关键因素。构建一个有效的指标体系是实现数据驱动的基石&#xff0c;它能够帮助企业明确业务目标、量化业绩表现、监控市场动态&#xff0c;并指导战略规划。一个精心设计的指标体系能够为企业提供一个全面的视图&a…

凡尔码来访登记卡助力来访安全

来访登记制度是指为了加强对来访人员的管理和安全控制&#xff0c;确保组织内部秩序和安全的一项制度。通过来访登记制度&#xff0c;可以对来访人员的身份进行核实&#xff0c;了解来访目的&#xff0c;并采取相应的安全措施&#xff0c;为组织内部的工作和人员安全提供保障。…

【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 对话框 | 创建自定义对话框 文章编号&#xff1a;Qt 学习笔记…

为什么代理IP都没有100%可用性?

在当今高度互联的网络环境中&#xff0c;代理IP已成为许多网络活动的重要支撑工具&#xff0c;从数据收集到业务推广&#xff0c;无所不包。然而&#xff0c;代理IP在很多场景中发挥着重要作用&#xff0c;却很难实现100%的可用性。 这种情况并非偶然&#xff0c;而是受到多重复…

【Qt 学习笔记】Qt窗口 | 标准对话框 | 字体对话框QFontDialog

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 标准对话框 | 字体对话框QFontDialog 文章编号&#xff1a;Q…

IEOSE 2024北京国际教育留学海外院校展览会11月举办

IEOSE 2024北京国际教育留学展览会 IEOSE 2024 Beijing International Education and Overseas Study Exhibition 2024年11月15日-11月17日&#xff08;周五-周日&#xff09; 15th-17th November, 2024 北京国家会议中心 China National Convention Ce…

C# WPF 读写CAN数据

C# WPF 读写CAN数据 CAN 分析仪 分析仪资料下载 官方地址&#xff1a;https://www.zhcxgd.com/1.html CSDN&#xff1a; 项目配置 复制Dll库文件 文件在上面的资料里面 设置不安全代码 CAN C#工具类 CAN_Tool.cs using Microsoft.VisualBasic; using System; using Sys…

ASM-MehotdVisitor实践

使用ASM几乎用户全部的精力都是对MethodVisitor的处理&#xff0c;方法code的处理都需要使用这个类进行操作。还是之前文章说过的&#xff0c;ASM单独学习意义并不大&#xff0c;难以达到触类旁通&#xff0c;先行掌握字节码基础后再玩起ASM才能体会真正的乐趣&#xff0c;不然…

【Python】已解决TypeError: unsupported operand type(s) for ...报错方案合集

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

【Python】selenium 点击某个按钮 click() 出现的报错问题--ElementClickInterceptedException(全!)

写在前面&#xff1a; 我们在使用selenium 点击某个元素时或者获取find_element的某个网页元素时&#xff0c;总会遇到一些问题。本人经验是&#xff0c;最直接的方法是用try_except 报错&#xff0c;直接绕过问题&#xff0c;可以直接看第一条。如果有兴趣具体解决&#xff0c…

让你事半功倍的高效管理微信方法

随着私域运营的需求不断增长&#xff0c;对于使用微信进行运营的企业或个人来说&#xff0c;高效的管理微信变得越发重要&#xff0c;今天分享一些高效管理微信的实用方法&#xff1a;

图像的混合与渐进变换

1.实验目的 平常我们看到的美图秀秀等两个图片混合是怎么生成的呢&#xff0c;今天我们看看图像处理关于这部分怎么做的&#xff1f; 2.实验条件 pycharm python编译器 3.实验代码 # File: 图像混合与渐进变换.py # Author: chen_song # Time: 2024/6/11 下午6:08 "…