代码随想录算法训练营Day37 |01背包登场,416. 分割等和子集

今天学习了一个新的内容——01背包,应用场景是这样的,你有一个背包最多能装重量为maxweight重量的物品,你有n个物品,他们的价值分别为value[i],重量分别为weight[i],其中i为物品的下标,每件物品只能用一次,你需要保证在不超过背包所能承受的最大重量的情况下,背包内所装的最大价值是多少?这就是大名鼎鼎的01背包,那么对于这样一个问题,我们该如何思考呢,首先,还是老规矩,直接上动规五部曲

01背包问题 二维:

1.dp数组的定义和下标的含义

dp[i][j] 代表的意思就是在前 i 个物品里选择若干个物品,放在容量为j的背包里所代表的最大价值为多少,这就是dp数组的含义

2.dp数组的递推公式

我们知道对于当前的位置,你只有两种选择,那就是将物品放进背包,或者是不放进背包,那这里就有一个前提了,那就是此时的背包的容量与你的物品的重量的关系,如果说,你物品的重量大于我此时背包的容量,就说明一定是不放进去的,那就说明此时不需要做状态转移,拿这里的dp[ i ][ j ]应该等于多少呢,我们一定要明确dp数组的定义,此时背包的容量就是j,所以j是不动的,但是现在这个物品是不放进去的,所以我对应的i是不是应该减一啊,所以此时的状态转移方程应该就是dp[ i ][ j ] = dp[ i -1 ][ j ],那么另一种情况,如果说不大于背包的容量,这个物品是可以放进去的,那么我们是不是就是在放进去的价值和不放进去的价值中取一个最大值啊,所以放进去的转移方程应该怎么写呢,还是dp数组的含义,如果我放进去了,那么是不是此时我背包的容量就仅剩j - weight[ i ] 了,那这是不是就是在前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数组的初始化

这里的初始化就很有讲究了,首先,就是要明确一点,我们这个dp数组的当前值是不是都是由左上和上方的值转移过来的啊,所以,我们最左边和最上面的值是必须要初始化的,首先来看最左边,当背包的容量为0时,是不是装不进任何的物品,所以全部初始化为0,当放入的物品数量为1时,我们就要看他的物品的重量是不是大于背包的容量,如果大于背包的容量,就是可以放进去的,不是的话,就是0,其他的由于都是在后面遍历的过程中会被覆盖,所以只要初始化为0就可以了

4。dp数组的遍历顺序,这里的遍历顺序是没有要求的,因为你无论是先遍历物品还是背包,你的左上部分和你的上面始终都是存在数值的,或者说是已经初始化好了,或者是已经遍历过了,所以这里是不做要求的

那么以上就是01背包二维dp数组的理论部分

01背包问题 一维:

一维呢实际上就是一个滚动数组,在二维的基础上做了一个状态压缩,实际上就是将i的那一层给压缩了,这里你就需要注意一点了,首先就是递推公式的变化,递推公式应该就是这样了,因为在二维我们知道,如果说不放入物品的话,就是直接是上面一层的状态直接复制下来,用代码表示就是这样——dp[ i ][ j ] = dp[ i -1 ][ j ],但是现在我们去除了i这一层,所以就直接写成dp[ j ] = dp[j]就可以了,如果放进去就是——dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); 还有就是初始化的操作,这里还是要再次明确dp数组的含义,和上面差不多,dp[0] = 0,其他的都是在后面遍历的时候会赋值的,所以也初始化为0就可以了,至于遍历顺序,遍历背包的顺序是不一样的,因为如果还是从前往后遍历,会把初始值给覆盖掉,所以这里要从后往前遍历,值得注意的是在内层循环遍历背包的时候,你的循环的终止条件就是大于等于我的weight[i]了,因为你要看我的递推公式有个j - weight[i] ,这样才能避免下标越界,并且小于的话也没有意义。

416. 分割等和子集:代码随想录

这道题目最重要的点是你必须要会一个转换,就是你需要在数组中找到若干个元素的和为sum的一半,这一点是非常重要的,这样你就可以将其转化为一个01背包问题,因为题目中说让你判断将这个nums数组分成两个子集,他们的和能不能相等来一个简单的数学证明,假设我选的元素的和为p,那么剩余的元素的和为为sum - p,这里的sum代表所有的元素的和,然后就是2p = sum,p = sum / 2,这样就转化为了一个01背包问题,当然,如果说sum%2!=0的话,那么我们直接返回false就可以了,然后就是dp数组以及其下标的含义,这里你还需要注意的一点就是他这里的weight数组和value数组都是nums数组,所以我们只需要在遍历完后看dp[target]是不是等于target即可,如果等于的话,就代表背包已经装满了,那么此时我直接返回true即可,相反如果不等于的话就直接返回false,这里dp数组的含义就是在背包容量为j的情况下我背包的价值是多少,递推公式只要做一点小小的改动,就是将weight数组和value数组全部改成nums数组就可以了,下面来看具体代码的实现:

class Solution {
public:bool canPartition(vector<int>& nums) {int sum=0;int n=nums.size();for(int i=0;i<n;i++) sum+=nums[i];if(sum%2!=0) return false;else {int target=sum/2;vector<int> dp(10002,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]);}}return dp[target]==target;}}
};

首先就是初始化,这里是全部初始化为0,然后就是遍历顺序,和上面的一维dp数组一样,就是内层循环从后往前遍历,直到j小于nums[i]的时候为止,最后返回是否相等即可,这题我也是没有写出来,思路我都想明白了,但是就是不知道代码应该怎么写,可能是今天刚刚接触这个新的知识吧,我现在觉得我已经差不多清楚01背包的大致过程了,但是一些细节上的点,还是不是很明白

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

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

相关文章

关于bim数字孪生threejs中使用glb文件大小优化及加载慢的说明(笔记)

在用three.js开发的时候发现&#xff0c;稍微大一点的glb或者fbx文件加载的时候很慢很卡 一直不理解这个卡和慢取决于哪些条件&#xff0c;下面来详细说一下 1、关于模型 不是越大加载越卡顿&#xff0c;而是却决于三角面数量&#xff0c;当累计三角面数量达到3000万时会出现明…

ASUS/华硕天选5 FX607J系列 原厂Windows11系统

安装后恢复到您开箱的体验界面&#xff0c;带原机所有驱动和软件&#xff0c;包括myasus mcafee office 奥创等。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http:…

LLaMA2模型训练加速秘籍:700亿参数效率提升195%!

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID &#xff5c; 计算机视觉研究院 学习群 &#xff5c; 扫码在主页获取加入方式 开源地址&#xff1a;https://github.com/hpcaitech/ColossalAI 计算机视觉研究院专栏 Column of Computer Vision Ins…

Microsoft Defender防病毒怎么关闭!详细步骤看这里!

Microsoft Defender是Windows系统中的防病毒软件&#xff0c;提供了实时的安全保护功能。但是&#xff0c;在某些情况下&#xff0c;用户想要关闭系统内的Microsoft Defender功能&#xff0c;但不知道要怎么操作才能关闭&#xff1f;接下来小编给大家带来详细的关闭步骤介绍。 …

柔性数组(flexible array)

柔性数组从C99开始支持使用 1.柔性数组的概念 概念&#xff1a; 结构体中&#xff0c;结构体最后一个元素允许是未知大小的数组&#xff0c;这就叫[柔性数组]的成员 struct S {int n;char arr[]; //数组大小未知(柔性数组成员) }; 柔性数组的特点&#xff1a; 结构体中柔性…

入门JavaWeb之 MVC、Filter 过滤器和监听器

MVC 三层架构&#xff1a; Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09; 控制器&#xff1a;Controller&#xff0c;可以理解成 Servlet 1.接收用户的请求&#xff08;req&#xff1a;请求参数、Sessio…

fastapi获取请求路径

fastapi获取请求路径 在FastAPI中&#xff0c;你可以使用fastapi.Request对象来获取请求路径。 from fastapi import FastAPI, Requestapp FastAPI()app.get("/items/{item_id}") async def read_item(request: Request, item_id: str):# 获取完整的请求路径reque…

java技术:knife4j实现后端swagger文档

一、pom依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version> </dependency> lombok依赖 <dependency><groupId>org.proje…

【AI-小米机器狗】Dockerfile包含SSH和SFTP

通过这些步骤&#xff0c;可以在docker容器中安装运行SSH和SFTP服务&#xff0c;设置ssh和sftp的密码&#xff0c;克隆指定的Git仓库到/home目录&#xff0c;并使用bash作为入口点&#xff0c; # 基于原始镜像 FROM cyberdog_sim:v1# 更新APT源为清华源 RUN sed -i s|http://a…

消息列队 定时任务 长链接是做什么用的?

消息队列、定时任务和长连接在计算机科学和网络通信中各自扮演了重要的角色。以下是它们的主要用途和功能的简要概述&#xff1a; 消息队列&#xff1a; 消息队列是一种通信方法&#xff0c;允许应用程序或系统组件通过发送和接收消息来进行交互。其主要用途包括&#xff1a;…

VBA技术资料MF170:调整多个工作薄中签名位置

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

数据可视化如何为智慧农业带来变革

数据可视化如何为智慧农业保驾护航&#xff1f;随着农业现代化的深入推进&#xff0c;智慧农业应运而生&#xff0c;通过集成物联网、大数据、人工智能等先进技术&#xff0c;实现农业生产的数字化、智能化和高效化。而在这一过程中&#xff0c;数据可视化技术作为重要的工具&a…

主从复制、哨兵以及Cluster集群

目录 1.Redis高可用 2.Redis主从复制 2.1 主从复制的作用 2.2 主从复制流程 2.3 搭建Redis主从复制 2.3.1 修改Redis配置文件&#xff08;Master节点操作&#xff09; 2.3.2 修改Redis配置文件&#xff08;Slave节点操作&#xff09; 2.3.2 验证主从复制结果 3.Redis哨…

用GAN生成奖杯

数据集链接:https://pan.baidu.com/s/19Uxc2ELiMG3acUtLeSTDTA?pwd=wsyw 提取码:wsyw 我设置的图片大小为128*128,如果内存爆炸可以将batch_size调小,epoch我设置的2000,我感觉其实1000也够了。代码如下: import argparse from torchvision import datasets, transfor…

大模型日报 2024-06-27

大模型日报 2024-06-27 大模型资讯 1.OpenAI计划打造“大语言模型操作系统”&#xff0c;收购Rockset和Multi OpenAI计划建立一个名为LLMOS&#xff08;Large Language Model Operating System&#xff09;的大语言模型操作系统&#xff0c;类似于Windows和MacOS&#xff0c;旨…

基于改进天鹰优化算法(IAO)优化支持向量机(SVM)数据回归预测(IAO-SVM)

改进天鹰优化算法(IAO)见&#xff1a;【智能优化算法】改进的AO算法(IAO)-CSDN博客 支持向量机(SVM)数据时序预测&#xff1a;基于支持向量机的数据回归预测-CSDN博客 代码原理 基于改进天鹰优化算法&#xff08;IAO&#xff09;优化支持向量机&#xff08;SVM&#xff09;数…

大数据之路 读书笔记 Day3

回顾&#xff1a;Day 2 总结了浏览器日志采集的过程 回看点击&#xff1a;大数据之路 读书笔记 Day 2 无线端客户的日志采集 无线端客户日志采集名为UserTrack&#xff08;UT&#xff09;的SDK来采集&#xff0c;UT将采集称为事件&#xff0c;常用的包括页面事件&#xff08;即…

代码随想录算法训练营第三十七天|01背包问题、分割等和子集

01背包问题 题目链接&#xff1a;46. 携带研究材料 文档讲解&#xff1a;代码随想录 状态&#xff1a;忘了 二维dp 问题1&#xff1a;为啥会想到i代表第几个物品&#xff0c;j代表容量变化&#xff1f; 动态规划中&#xff0c;每次决策都依赖于前一个状态的结果&#xff0c;在…

A37 STM32_HAL库函数 之PCD通用驱动 -- C-- 所有函数的介绍及使用

A37 STM32_HAL库函数 之PCD通用驱动 -- C-- 所有函数的介绍及使用 1 该驱动函数预览1.23 HAL_PCD_EP_Close1.24 HAL_PCD_EP_Receive1.25 HAL_PCD_EP_GetRxCount1.26 HAL_PCD_EP_Transmit1.27 HAL_PCD_EP_SetStall1.28 HAL_PCD_EP_ClrStall1.29 HAL_PCD_EP_Flush1.30 HAL_PCD_Ac…

Java中使用键盘录用【Scanner】遇到的问题

目录 一、空格截断问题&#xff1a;二、next()、nextInt()、nextDouble()等nextXxx()与nextLine()连用、混用的问题&#xff1a;问题描述&#xff1a;代码演示问题问题原因&#xff1a;解决办法&#xff1a;示例代码&#xff1a; 最后 Java中使用键盘录入&#xff0c;尤其是通过…