代码随想录算法训练营第42天 | 01背包问题理论基础 + 416.分割等和子集

news2024/9/21 2:35:08

今日任务

目录

01背包问题 二维数组

01背包问题 一维/滚动数组

416.分割等和子集 - Medium


01背包问题 二维数组

理论基础:代码随想录

01 背包

有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

暴力解法:

  • 每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况
  • 暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化

二维dp数组

  • 1 确定dp数组及含义:

        dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少

  • 2 递推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])
  • 3 dp数组初始化:所有dp[i][0]均为0;当 j < weight[0]的时候 dp[0][j] 是 0,当j >= weight[0]时,dp[0][j] 是value[0]
  • 4 确定遍历顺序:有两个遍历的维度,物品与背包重量,先遍历物品更好理解
  • 5 推导dp数组:如下,无参数版
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背包问题 一维/滚动数组

理论基础:代码随想录

推荐 使用一维dp数组的写法,比较直观简洁,而且空间复杂度还降了一个数量级 

在二维dp数组的基础上,其实可以把dp[i - 1]那一层拷贝到dp[i]上,表达式完全可以是:dp[i][j] = max(dp[i][j], dp[i][j - weight[i]] + value[i]);与其把dp[i - 1]这一层拷贝到dp[i]上,不如只用一个一维数组了,只用dp[j](一维数组,也可以理解是一个滚动数组)。

这就是滚动数组的由来,需要满足的条件是上一层可以重复利用,直接拷贝到当前层。

滚动dp数组:

  • 1 dp[j]:容量为j的背包,所背的物品价值可以最大为dp[j]
  • 2 递推公式:dp[j]有两个选择,一个是取自己dp[j] 相当于 二维dp数组中的dp[i-1][j],即不放物品i;一个是取dp[j - weight[i]] + value[i],即放物品i,指定是取最大的
    dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
  • 3 初始化:都初始为0就可以了
  • 4 遍历顺序:一维dp遍历的时候,背包是从大到小,倒序遍历是为了保证物品i只被放入一次,每次取得状态不会和之前取得状态重合,这样每种物品就只取一次了;两个嵌套for循环的顺序,先遍历物品嵌套遍历背包容量,不可颠倒
  • 5 推导dp数组:无参数版
    def test_1_wei_bag_problem():
        weight = [1, 3, 4]
        value = [15, 20, 30]
        bagWeight = 4
    
        # 初始化
        dp = [0] * (bagWeight + 1)
        for i in range(len(weight)):  # 遍历物品
            for j in range(bagWeight, weight[i] - 1, -1):  # 遍历背包容量
                dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
    
        print(dp[bagWeight])
    
    
    test_1_wei_bag_problem()

416.分割等和子集 - Medium

题目链接:力扣-416. 分割等和子集

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 

提示: 转换成背包容易为 1/2 数组和的 01背包问题

class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        if sum(nums) % 2 == 1: return False

        bagWeight = sum(nums) // 2
        dp = [0] * (bagWeight + 1)
        for i in range(len(nums)):  # 遍历物品
            for j in range(bagWeight, nums[i] - 1, -1):  # 遍历背包容量
                dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
        
        if dp[bagWeight] == bagWeight:
            return True
        else:
            return False

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

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

相关文章

课程18:角色权限功能实现

🚀前言 本文是《.Net Core从零学习搭建权限管理系统》教程专栏的课程(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。 专栏适用于人群:We…

chatgpt赋能python:Python生成C++代码-提高生产力的利器

Python 生成 C 代码 - 提高生产力的利器 Python 作为一种高级编程语言&#xff0c;在数据分析、机器学习等领域都有着广泛的应用。但是&#xff0c;Python 被认为速度慢&#xff0c;无法处理一些高性能的任务。此时&#xff0c;C这种低级语言就被用来替代 Python&#xff0c;以…

实战:构建工具-共享库配置实践-2023.6.22(测试成功)

实战&#xff1a;构建工具-共享库配置实践-2023.6.22(测试成功) 目录 推荐文章 https://www.yuque.com/xyy-onlyone/aevhhf?# 《玩转Typora》 实验环境 gitlab/gitlab-ce:15.0.3-ce.0 jenkins/jenkins:2.346.3-2-lts-jdk11实验软件 链接&#xff1a;https://pan.baidu.com/…

Flutter Dart操作符

常见的操作符大家都知道就不多介绍了&#xff0c;主要来看看Java所没有的。 类型判定操作符 as、 is、 和 is! 操作符是在运行时判定对象 类型的操作符 操作符解释as类型转换is如果对象是指定的类型返回 Trueis!如果对象是指定的类型返回 False as 操作符把对象转换为特定的类…

如何加入开源社

开源社成立于 2014 年&#xff0c;是由志愿贡献于开源事业的个人成员&#xff0c;依 “贡献、共识、共治” 原则所组成&#xff0c;始终维持厂商中立、公益、非营利的特点&#xff0c;是最早以 “开源治理、国际接轨、社区发展、项目孵化” 为使命的开源社区联合体。开源社积极…

chatgpt赋能python:Python生成GUID:让你的代码变得更加唯一

Python生成GUID&#xff1a;让你的代码变得更加唯一 在现代软件开发领域中&#xff0c;一个核心的问题是如何确保代码生成的ID是唯一的。通过Python语言生成全球唯一标识符&#xff08;GUID&#xff09;是一个非常流行的方法&#xff0c;而且是非常容易实现的。 什么是Python…

FutureTask源码

介绍 在创建线程的方式中&#xff0c;我们可以直接继承Thread和实现Callable接口来创建线程&#xff0c;但是这两种创建线程的方式不能返回执行的结果。于是从JDK1.5开始提供了Callable接口和Future接口&#xff0c;这两种创建线程的方式可以在执行完任务之后返回执行结果。 …

Java8 LocalDateTime获取当前周是本年第几周weekOfYear,用WeekFields

Java8 LocalDateTime获取当前周是本年第几周weekOfYear, 可用WeekFields LocalDateTime 没有直接获得 weekOfYear 的方法 LocalDateTime 有一个 get(TemporalField field) 方法, 返回 int public int get(TemporalField field) {if (field instanceof ChronoField chronoFiel…

读发布!设计与部署稳定的分布式系统(第2版)笔记09_一窝蜂和容量

1. 停电事故后电力恢复的方式 1.1. 停电后常见的情形是&#xff0c;送电几秒钟后又再次断电 1.2. 数百万台空调和冰箱的用电需求&#xff0c;使刚刚恢复的电力供应发生过载 1.3. 当电力供应不足时&#xff0c;增加的电流很快就到达满负荷&#xff0c;导致过载&#xff0c;触…

chatgpt赋能python:Python中的点形状:了解点与其表现形式

Python中的点形状&#xff1a;了解点与其表现形式 在Python编程中&#xff0c;点是一种十分重要的形状&#xff0c;它不仅可以用来表示数据结构中的节点&#xff0c;还可以用来绘制图形。本篇文章将介绍Python中点形状的表现形式和相关知识点。 点的表现形式 在Python中&…

跨 OT 部门管理来自新兴技术的网络风险挑战

本文首发微信公众号网络研究院&#xff0c;关注获取更多。 随着 AI 和自动化工具被引入企业&#xff0c;解决这些新技术&#xff08;包括 OT 环境中的生成 AI&#xff09;带来的网络风险需要一种综合方法。 这些新兴技术进步可以在 OT&#xff08;运营技术&#xff09;基础设…

【夜深人静写数据结构与算法 | 第八篇】哈希算法与哈希表

目录 前言&#xff1a; 哈希&#xff1a; 哈希表&#xff1a; 哈希表组成&#xff1a; 哈希表实例&#xff1a; 哈希函数&#xff1a; TIPS&#xff1a; 总结 前言&#xff1a; 如果此时我要你默写一个有一百位的数字&#xff0c;你要如何做才能保证不会漏写呢&#xf…

Jenkins安装手册

Jenkins安装手册 一、前期准备工作 因为我是在Windows系统上连接Linux服务器以及需要把在Windows系统下载的安装包上传到Linux系统&#xff0c;所以需要用到两个工具---putty 和FileZilla。 Putty是一个免费的、Windows 32平台下的telnet、rlogin和ssh客户端&#xff0c;但是…

IDEA新UI速览,成了VS Code的样子?

IntelliJ IDEA 2023.1 现已发布。此版本包括对新 UI 的改进&#xff0c;根据从用户那里收到的反馈进行了彻底改造。此外还实现了性能增强&#xff0c;从而在打开项目时更快地导入 Maven 和更早地使用 IDE 功能。由于采用了 background commit checks&#xff0c;新版本提供了简…

【首发】随身wifi编译/使用ffmpeg方法,包含openwrt和debian

目录 1.硬件改造 2.软件改造 3.下一步计划 背景是23年4月入了随身wifi的坑后&#xff0c;发现除了硬件上的改造&#xff0c;软件的可玩性也很大&#xff0c;网上可以找到不少打印机&#xff0c;直播推流&#xff0c;甚至家庭智能硬件的改造教程。笔者是因为改造遥控小车&…

【前端】Element-UI和Element-Plus的区别

文章目录 对移动端支持区别框架区别开发中使用的区别el-tableel-dialogel-buttonel-date-pickerel-iconechartsIcon图标库变化了组件的插槽slot使用变化了新增组件 来源 对移动端支持区别 Element-UI对应Element2&#xff1a;基本不支持手机版 Element-Plus对应Element3&…

chatgpt赋能python:Python生成A到Z的SEO

Python 生成A到Z的SEO Python 是一种简单易学、功能强大的编程语言&#xff0c;它不仅可用于数据分析、机器学习等领域&#xff0c;还可以用于 SEO 工作中的自动化。在 SEO 中&#xff0c;我们常需要生成不同字母序列来作为页面的标题标签&#xff08;Title Tag&#xff09;&a…

Unencode

打开得到一串密文&#xff0c;看题目形式应该也是一个编码格式 果然是&#xff0c;直接利用网上工具解码就得到flag Uuencode编码 稍微了解了一下Uuencode编码的方式&#xff1a; Uuencode是二进制信息和文字信息之间的转换编码&#xff0c;也就是机器和人眼识读的转换。Uuenco…

从MVC到MVVC:软件架构的演变和迭代

文章目录 1.引言介绍MVC和MVVC架构1. MVC架构2. MVVC架构 2.MVC架构什么是MVC架构MVC的组成部分及其作用1. 模型(Model)2. 视图(View)3. 控制器(Controller) MVC的优点和缺点 3.MVVC架构什么是MVVC架构1. 模型(Model)2. 视图(View)3. 视图模型(View Model) MVVC的组成部分及其作…

2022(一等奖)B22基于时空大数据的多维分析与传统二维分析相结合的大气污染变化研究方法探索

作品介绍 1 作品背景及研究对象 1.1 背景及必要性介绍 2022年春节期间&#xff0c;山东及多地的部分省市明确了禁放烟花爆竹的规定&#xff0c;直接表明了当今大气污染变化的严峻形势&#xff0c;燃放烟花爆竹会严重影响空气环境质量&#xff0c;加剧雾霾天气&#xff0c;产生…