代码随想录算法训练营第四十四天 | 01背包问题 二维、 01背包问题 一维、416. 分割等和子集

news2025/1/11 6:34:49

01背包问题 二维

代码随想录

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

 1.dp数组定义

dp[i][j]  下标为[0,i]之间的物品,任取放容量为j的背包的最大价值

2.递推公式

不放物品i: dp[i-1][j]  去看是否放i-1,还是有j的容量给i-1去放

放物品i : dp[i-1][j-weight[i]] + value[i],放了物品i,那么就只有j-weight[i]的容量给i-1个物品去放了,同时要加上我这个物体的价值

 dp[i][j] = max(上面两个),取最大价值

3.数组初始化

首先看,i是由i-1推出来的,j是否左上的某一个格子或者正上推出来的(背包剩余容量)

dp[i][0] = 0,背包的容量为0,不管放哪个,价值都为0

dp[0][j] , 当背包可以装下这个物品开始,dp[0][j]就等于这个物品的价值,装不下就为0

4.遍历顺序

for(i<weight.size() )   物品

  for(j<=bagweight )    背包

对于二维数组实现的01背包,物品和背包的遍历顺序是可以颠倒的,因为左上方和上方是有值的

循环体内是正序还是倒序都是可以的,因为都是根据上一行的数据来进行推导的

01背包问题 一维

代码随想录

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

因为这里的i层都是由i-1层推到出来的,因此只需要一个一行的一维滚动数组来维护就可以了,不需要整个二维数组

1. dp[j] 容量为j的背包的最大价值为dp[j]

2.递推公式

不放物品i,就是自己dp[j],也就是把上一层数据拷贝下来

放物品i , dp[j-weight[i]] + value[i]

dp[j] = max(上面两个)

3.初始化

dp[0]=0 , 背包容量为0的时候,最大价值为0

非零下标都是初始化为0,因为为其他的话,会覆盖掉递推公式中算出来的值

4.遍历顺序

for(i<weight.size())  物品

  for(j=bagweight,j>=weight[0] )  背包

采用倒序,是为了防止物品重复选取,比较的数据来自上一轮

正序遍历就是用同一个物品塞满背包,每次覆盖的数据都是同一个物品塞满的情况

dp【i】【j】的更新只与dp【i-1】【j】和dp【i-1】【j-weight_i】左上角这两个数据有关,而与右边的数据无关,那么从右向左遍历,遍历时左边的数据还是上一行的数据没有更新, 这样子用一行数组很好的实现了我们的最终目的

在一维中,只能先遍历物品,再遍历背包

如果先遍历背包,再遍历物品,那记录的就是只有一个物品

 

416. 分割等和子集

代码随想录

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

解题思路

本题元素只能使用1次,并且看能不能装满11这个背包

1.dp[j] 容量为j的背包的最大价值,本题最大价值和重量,都是数字本身

2. dp[j] = max(dp[j], dp[j-nums[i] + nums[i]])

3.dp[0] = 0;非零下标,初始为非负整数的最小值,也就是0,因为是由max得来的

4.遍历顺序,先遍历物品,再遍历背包,背包是倒序,j要大于等于nums[i],且每个物品只能使用一次

最后去判断背包是否装满了 dp[target] == target

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

收获

今天掌握了01背包的理论基础,本尝试应用

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

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

相关文章

Microsoft Fabric 是什么?

最近半个月没有更新内容&#xff0c;原因是什么呢&#xff1f; 原因是花了两周的时间备考了一下"Microsoft Certified: Fabric Analytics Engineer Associate"的考试认证。 非常幸运考试通过了。 那什么是Microsoft Fabric 呢&#xff1f; Microsoft Fabric 是一个…

瑞芯微 RK3588 环境搭建 SDK编译

厂家给的资料下载下来之后 我的目录如下 厂家推荐是虚拟机下 我这真好有真实的UBUNTU环境 就不用虚拟机了 直接在真机上安装 linux版本是 Ubuntu 22.04 切到Linux目录下 这里主要用到两个目录 一个是源码也即SDK 交叉编译链 编译工具 先安装交叉编译链 按照文档说明 先…

Linux前奏-预热版本

一、操作系统概述 1.1 了解操作系统的作用 我们所熟知的计算机&#xff0c;也就是电脑&#xff0c;就是由硬件和软件来组成的 硬件&#xff1a;计算机系统中由电子机械&#xff0c;和各种光电元件等组成的各种物理装置的总称 软件是什么呢&#xff1f; 软件&#xff1a;用…

electron初学

最近有一个开发桌面端的业务&#xff0c;考虑到跨平台就使用了electron。 引用官网&#xff1a;Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows…

就业班 第四阶段(docker) 2401--5.29 day3 Dockerfile+前后段项目若依ruoyi

通过Dockerfile创建镜像 Docker 提供了一种更便捷的方式&#xff0c;叫作 Dockerfile docker build命令用于根据给定的Dockerfile构建Docker镜像。docker build语法&#xff1a; # docker build [OPTIONS] <PATH | URL | ->1. 常用选项说明 --build-arg&#xff0c;设…

el-tooltip 样式修改

<template><div><el-tooltip class"item" effect"dark" content"Right Bottom 提示文字" placement"right-end"><el-button>右下</el-button></el-tooltip></div> </template><sc…

接口请求参数为文件时如何测试

方法 工具&#xff1a;Postman 步骤&#xff1a;①点击body②点击form-data③选择key类型为fie ④输入参数名⑤选择参数上传⑥发送请求

Memoro:一款功能强大的堆栈数据细节分析工具

关于Memoro Memoro是一款功能强大的堆栈数据细节分析工具&#xff0c;该工具可以给广大研究人员提供关于堆内存数据的详细信息&#xff0c;并给出分析数据。 Memoro不仅可以告诉我们目标程序什么时候、在哪里进行了堆内存分配&#xff0c;而且还可以告诉我们目标程序是如何实际…

JPA详解

文章目录 JPA概述JPA的优势JPA注解 JPA概述 Java Persistence API&#xff08;JPA&#xff09;是 Java EE 平台的一部分&#xff0c;它为开发者提供了一种用于对象关系映射&#xff08;ORM&#xff09;的标准化方法。JPA 提供了一组 API 和规范&#xff0c;用于在 Java 应用程…

前端vue搭建

1.找一个合适的模板&#xff0c;可以用vue-element-admin的模板&#xff0c;但是个人认为这个模板太大了&#xff0c;做小项目修改起来比较复杂&#xff0c;可以找一个比较小的项目 2.我找的项目git clone https://github.com/tuture-dev/vue-admin-template.git&#xff0c;这…

Vivado报错 [Synth 8-9917] port ‘xx‘ must not be declared to be an array

报错位置&#xff1a; input wire [11:0] i_data [7:0] ,报错原因&#xff1a; Verilog并不支持将端口设置为数组类型&#xff0c;而SystemVerilog支持此写法。 解决办法&#xff1a; 将文件后缀.v改成.sv格式&#xff1b; 此时工程中文件确实&#xff0c;修正修改格…

留言板——增添功能(持久化存储数据,使用MyBatis)

目录 一、数据准备 二、引入MyBatis 和 MySQL驱动依赖 三、配置MySQL账号密码 四、编写后端代码 五、调整前端代码 六、测试 之前的代码&#xff1a;综合性练习&#xff08;后端代码练习3&#xff09;——留言板_在线留言板前后端交互-CSDN博客 一、数据准备 创建数据库…

glpi 安装与使用

1、环境介绍 操作系统&#xff1a;龙蜥os 8.9 nginx&#xff1a;1.26.1 php&#xff1a;8.2.19 mysql&#xff1a;MarinaDB 10.3.9 glpi&#xff1a;10.0.6 fusioninventory&#xff1a;fusioninventory-10.0.61.1 2、安装epel源 dnf install epel-release -y dnf install htt…

[个人笔记] 记录docker-compose使用和Harbor的部署过程

容器技术 第三章 记录docker-compose使用和Harbor的部署过程 容器技术记录docker-compose使用和Harbor的部署过程Harborhttps方式部署&#xff1a;测试环境部署使用自签名SSL证书https方式部署&#xff1a;正式环境部署使用企业颁发的SSL证书给Docker守护进程添加Harbor的SSL证…

活动预告|6月13日Apache Flink Meetup·香港站

6 月 13 日 | 香港 | 线下 Apache Flink Meetup 的风吹到了香江之畔&#xff0c;Apache Flink 香港 Meetup 来啦&#xff01;本次活动&#xff0c;我们邀请了来自阿里云的顶尖专家&#xff0c;帮助开发者全面了解 Apache Flink 的流批一体的数据处理能力&#xff0c;流式数据湖…

颠覆传统家居行业?线上3D数字化营销有何魅力?

在数字时代的浪潮中&#xff0c;Z时代年轻用户正成为泛家居行业的消费核心力量。作为数字原生的一代&#xff0c;他们追求的不仅仅是产品本身&#xff0c;更是独特的消费体验。为了迎合这一趋势&#xff0c;泛家居行业正积极引入线上3D数字化沉浸式营销&#xff0c;为用户提供前…

Redis相关详解

什么是 Redis&#xff1f;它主要用来什么✁&#xff1f; Redis&#xff0c;英文全称是 Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源✁使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化✁日志型、Key-Value 数据库&#xff…

优选算法一:双指针算法与练习(移动0)

目录 双指针算法讲解 移动零 双指针算法讲解 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff0c;一种是快慢指针。 对撞指针&#xff1a;一般用于顺序结构中&#xff0c;也称左右指针。 对撞指针从两端向中间移动。一个指针从最左端开始&#xff0c;另一个从最…

Windows 80端口占用解决办法

启动软件系统前&#xff0c;有时遇见端口被其他程序占用&#xff0c;导致无法启动系统 解决办法: # 查看端口占用情况 > netstat -ano | findstr 端口号通常端口占用&#xff0c;通过任务管理器查看PID&#xff0c;结束任务可以完成。System进程占用&#xff0c;结束不了&…

Vscode发生鼠标悬停正在加载、无法跳转和提示词的问题

Vscode发生鼠标悬停正在加载、无法跳转和提示词的问题 查看python语言服务器的日志&#xff0c;确定问题。 我的问题是加载的vscode 目录下存在一个很大的数据集目录&#xff0c;导致无法正常工作。 解决办法&#xff1a; 在vscode的pylance设置中&#xff0c;排除对应的目…