代码随想录算法训练营day35 | 0-1背包理论基础、416. 分割等和子集

news2024/12/24 3:00:13

碎碎念:加油!!
参考:代码随想录

0-1背包理论基础

几类背包的区别:
0-1背包的每种物品只有一个
完全背包的每种物品有无限个
多重背包的每种物品的个数各不相同
请添加图片描述
01背包:
有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
背包暴力解法:
每个物品只有两个状态:取或者不取,所以我们可以用回溯算法暴力搜索,枚举所有情况来看装满背包可以得到的最大价值。
动态规划五部曲:
在这里插入图片描述

  1. 确定dp数组以及下标的含义:dp[i][j],下标为[0,i]物品任取放进容量为j的背包里的最大价值。
  2. 确定递推公式:不放物品i,dp[i-1][j];放物品i,dp[i-1][j-weight[i]] + value[i]。dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i])。
  3. dp数组的初始化:见图中绿色区域。
  4. 确定遍历顺序:两层for循环,第一层for循环遍历物品,第二层for循环遍历背包。dp数组是二维数组,那么这个顺序可以颠倒,如果是一维数组(滚动数组),那么顺序不能颠倒了。
  5. 打印dp数组:主要用来debug。

当前层是由上一层推导来的,所以可以直接把上一层拷贝 到当前层,然后直接在当前层进行计算,把新的值覆盖到当前层中。

用一维dp数组实现01背包-动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[j],容量为j的背包所背的最大价值。
  2. 确定递推公式:不放物品i,dp[j];放物品i,dp[j-weight[i]] + value[i]。
    dp[j] = max(dp[j], dp[j-weight[i]] + value[i])。
  3. dp数组的初始化:dp[0]=0,递推公式里是取最大值,所以初始化应该初始化为非负数的最小值,所以可以把dp数组全部初始化为0。
  4. 确定遍历顺序:两层for循环,第一层for循环遍历物品,第二层for循环遍历背包。遍历背包的时候倒序遍历。倒序遍历是为了保证每一个物品的值只被添加一次。
  5. 打印dp数组:主要用来debug。

416. 分割等和子集

题目链接

416. 分割等和子集

思想

请添加图片描述
容量为11的背包,能否把它装满,能装满就能找到,每个元素只能使用一次,所以这是01背包,容量和价值是一样的,当dp[target]==target就说明装满了。

动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[j],容量为j的背包所背的最大价值。
  2. 确定递推公式:dp[j] = max(dp[j], dp[j-nums[i]] + nums[i])。
  3. dp数组的初始化:dp[0]=0,递推公式里是取最大值,所以初始化应该初始化为非负数的最小值,所以可以把dp数组全部初始化为0。
  4. 确定遍历顺序:两层for循环,第一层for循环遍历物品,第二层for循环遍历背包。遍历背包的时候倒序遍历。倒序遍历是为了保证每一个物品的值只被添加一次。
  5. 打印dp数组:主要用来debug。

题解

// cpp
class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];
        }
        if (sum % 2 == 1) return false;
        int target = sum / 2;
        vector<int> dp(10001, 0);
        for (int i = 0; i < nums.size(); i++) {
            for (int j = target; j >= nums[i]; j--) {
                dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
            }
        }
        if (dp[target] == target) return true;
        return false;
    }
};
# python
class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        _sum = 0
        dp = [0] * 10001
        for num in nums:
            _sum += num
        if _sum % 2 == 1:
            return False
        target = _sum // 2

        for num in nums:
            for j in range(target, num - 1, -1):
                dp[j] = max(dp[j], dp[j-num] + num)
        
        if dp[target] == target:
            return True
        return False

反思

注意遍历物品和背包的顺序,注意遍历背包的时候要倒序遍历,防止重复使用同一个数字。

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

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

相关文章

如何开发属于你的智能人才招聘系统:源码解析

今天&#xff0c;小编将从源码解析的角度&#xff0c;带你深入了解如何开发属于你的智能人才招聘系统。 一、为什么选择开发自己的智能招聘系统&#xff1f; 市面上已有许多现成的招聘系统&#xff0c;但这些系统往往无法完全满足企业个性化的需求。通过开发自有系统&#xf…

中小型水库雨水情及大坝安全监测系统完整方案

一、背景 随着气候变化和极端天气事件的频发&#xff0c;中小型水库的安全运行显得愈发重要。为确保水库大坝的稳定性和防洪功能的发挥&#xff0c;建设一套完善的雨水情及大坝安全监测系统显得尤为重要。本文将从系统背景、系统介绍、应用实例和未来展望等方面&#xff0c;对…

【HTML入门】第二十三课 - 【实战】做一个简单的图书详情页

这一节&#xff0c;我们继续用纯HTML来做一个实战小案例。 我找了一个图书详情的页面&#xff0c;就像这样&#xff1a; 这一小节&#xff0c;我们用纯HTML标签&#xff0c;来实现一下这个图书详情的内容。 目录 1 布局分析 2 用到的标签 3 实战代码 1 布局分析 我们看这张…

SQL各种注入详解加案例--持续更新

sql注入 联合查询注入案例手工注入判断是否有SQL注入漏洞 sqlmap工具注入 报错注入常用的函数updatexml()函数案例 floor()涉及的函数实现手工注入sqlmap工具注入 盲注布尔盲注案例手工注入脚本sqlmap自动化工具 时间盲注 post注入GET传参和POST传参案例手工注入sqlmap工具 二次…

Venv复制可以减少Pip install

接前面的一篇博客《PyCharm找不到Python咋办》中遇到的步骤&#xff1a; 有上图的提示&#xff0c;说明需要将原来的venv进行清空。&#xff08;还可以用重命名的方式&#xff0c;这样venv当中的库可以保留&#xff0c;如果Python的版本和原来一样的话&#xff0c;直接覆盖回来…

10个日常开发必备的 JavaScript 代码片段

在 Web 开发领域&#xff0c;开发效率是关键。为什么每次开始新项目时都要重新发明轮子&#xff1f;今天&#xff0c;本文汇总整理了一些方便日常开发使用的 JavaScript 代码片段&#xff0c;超越了 Lodash 和 day.js 等常见代码片段&#xff0c;提升你的开发效率&#xff0c;减…

x264 中像素扩边算法源码分析

介绍 在视频编码中,特别是在使用x264这样的H.264/MPEG-4 AVC编码器时,像素扩边(或称为边缘扩展)是一项重要的预处理步骤。像素扩边的目的是在帧的边缘添加额外的像素,这样在编码过程中可以应用滤波器,如去块滤波器(deblocking filter)和水平/垂直滤波器,而不会受到帧…

Mysql开启SSL

等二测出未开启SSL,如下 have_openssl、have_ssl都是DISABLED也不知道当时为啥没开&#xff0c;看最近的都是开启的,整改必去得开了&#xff0c;开启步骤 1.生成秘钥 进入mysql的bin目录下&#xff0c;运行 ./mysql_ssl_rsa_setup运行后会生成证书 默认证书会在mysql的data…

PTrade常见问题系列20

量化周末测试不打印日志&#xff0c;需要如何测试&#xff1f; 需要将量化服务器后台时间&#xff0c;和ptrade终端所在的电脑时间改到下周一或周五&#xff0c;具体测试方案如下&#xff1a; 先停止nginx&#xff0c;并且备份nfs以防恢复异常。 1.重置生产账号A的密码(若测试…

sed 简易使用指南

sed 简易使用指南 1 sed 介绍2 查找3 替换4 反向引用5 删除6 cai&#xff08;菜&#xff09; 导言&#xff1a; 笔者之前花了较多时间学习并整理了sed命令相关的内容&#xff0c;以及一些进阶内容。但是&#xff0c;到后来使用也就只记得那么几个简单的选项&#xff0c;再高级的…

程序员进阶之路:缓存、网络、内存与案例

编辑推荐 适读人群 &#xff1a;本书适合有一定开发经验的开发人员&#xff0c;想要突破初级层次&#xff0c;迈向高级开发的程序员阅读。 【与时俱进】本书基于Linux 6.0及以上版本讲解书中涉及的各个模块&#xff0c;有助于读者理解现代Linux内核&#xff0c;掌握实用的技术…

XML动态sql查询当前时间之前的信息报错

如图&#xff0c;sql语句在数据库里可以正常运行但是再XML文件不可以正常运行&#xff0c;报错。 原因&#xff1a;在XML中小于号"<"是会被默认认定成文一个标签的开始&#xff0c;所以用小于号就会报错。 解决办法&#xff1a; 1.把表达式反过来改成大于号 2…

新手教学系列——使用 Redis 实现任务队列:先进先出和后进先出的选择

在分布式系统和高并发场景下,任务队列是管理任务调度和执行的关键工具。Redis 作为一种高效的内存数据库,提供了简单且强大的数据结构,可以方便地实现任务队列。本文将深入探讨如何利用 Redis 实现先进先出(FIFO)和后进先出(LIFO)两种任务队列,并介绍其应用场景和实现方…

11153 kill boss

这个问题可以通过模拟游戏的过程来解决。我们可以遍历每一轮的出招&#xff0c;根据出招的规则来计算每一轮的伤害&#xff0c;并更新Acmer和Boss的血量。如果在某一轮结束后&#xff0c;Acmer的血量小于等于0&#xff0c;那么Boss赢&#xff1b;如果Boss的血量小于等于0&#…

总线学习3--SPI

一 环境搭建 老规矩&#xff0c;先上图吧。。 上面电源线接到VBUS了&#xff0c;给的一个5V&#xff0c;应该3.3V。不过这个屏还能正常跑也是不错。 折腾了一个晚上&#xff0c;主要还是找驱动&#xff0c;然后熟悉SPI接口的接法。 遇到了两个坑&#xff1a; 1 接口名称不统…

Python异常处理:12个异常处理技巧,你掌握了几个?

探索Python异常处理的深度策略&#xff0c;从基础的try-except结构到自定义异常类的创建&#xff0c;再到利用上下文管理器和装饰器提升代码健壮性。深入理解异常传递机制&#xff0c;掌握日志记录与并发环境下异常处理的关键实践&#xff0c;强调了性能考量与避免异常作为控制…

简单的docker学习 第3章 docker镜像

第3章 Docker 镜像 3.1镜像基础 3.1.1 镜像简介 ​ 镜像是一种轻量级、可执行的独立软件包&#xff0c;也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境。具体来说镜像包含运行某个软件所需的所有内容&#xff0c;包括代码、库、环境变量和配置文件等…

尚硅谷谷粒商城项目笔记——三、安装docker【电脑CPU:AMD】

三、安装docker 注意&#xff1a; 因为电脑是AMD芯片&#xff0c;自己知识储备不够&#xff0c;无法保证和课程中用到的环境一样&#xff0c;所以环境都是自己根据适应硬件软件环境重新配置的&#xff0c;这里的虚拟机使用的是VMware。 首先关闭防火墙和安全策略 systemctl…

nature子刊真实案例,录用仅需1个月!1区SCI,截稿在即!

关注GZH【欧亚科睿学术】&#xff0c;第一时间了解期刊最新动态&#xff01; &#x1f680; &#x1f680; &#x1f680; &#x1f680; 快到飞起&#xff01;这本毕业神刊竟1个月秒录&#xff01; SCI期刊信息简介 【期刊类型】工程综合类SCIE&#xff08;1个月17天…

mac chrome打开网页,莫名其妙的闪退

今天&#xff0c;突然有用户反馈更新到浏览器版本后&#xff0c;打开特定网页时&#xff0c;浏览器会出现闪退的情况。 经过对业务代码长时间的排查都没有发现具体的问题&#xff0c;于是想到使用“大数据排查”&#xff08;上网google下&#xff09;的方法&#xff0c;终于在茫…