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

背包问题

二维01 背包

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

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

只看这个二维数组的定义,大家一定会有点懵,看下面这个图:

动态规划-背包问题1

2.确定递归表达式

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

dp[i][j]可以从两个方向推出,选择第i个物品和不选择第i个物品

1.选择第i个物品:dp[i][j]=max(dp[i-1][j],dp[i-1][j-wight[i]]+value[i]),选择价值大的

2.不选第i个物品:dp[i][j]=dp[i-1][j],因为没有选所以和选前i-1个物品价值一样

  3.dp数组如何初始化

关于初始化,一定要和dp数组的定义吻合,否则到递推公式的时候就会越来越乱

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

动态规划-背包问题2

 当i为0时,即当选择物品0 时,当容量小于物品0的体积时,dp[0][j]=0,否则为value[0];

4.确定遍历顺序

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

动态规划-背包问题3

本题都可以,先遍历物品在遍历背包较好理解


import java.util.Scanner;public class Main {public static int M;// M 代表研究材料的种类,public static int N;//  N,代表小明的行李空间。public static void main(String[] args) {Scanner sc=new Scanner(System.in);M=sc.nextInt();N=sc.nextInt();int[]wight=new int[M];//材料的重量int[]value=new int[M];//材料的价值for (int i = 0; i <M ; i++) {wight[i]=sc.nextInt();}for (int i = 0; i <M ; i++) {value[i]=sc.nextInt();}int[][]dp=new int[M][N+1];for (int i = 0; i <M ; i++) {dp[i][0]=0;}for (int i = wight[0]; i <=N ; i++) {dp[0][i]=value[0];}for (int i = 1; i <M ; i++) {for (int j = 1; j <=N ; j++) {if(j<wight[i]){//不放dp[i][j]=dp[i-1][j];}else {dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-wight[i]]+value[i]);}}}System.out.println(dp[M-1][N]);}
}

一维dp数组(滚动数组)

1.确定dp数组的定义

在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。

2.一维dp数组的递推公式

dp[j]为 容量为j的背包所背的最大价值,那么如何推导dp[j]呢?

dp[j]可以通过dp[j - weight[i]]推导出来,dp[j - weight[i]]表示容量为j - weight[i]的背包所背的最大价值。

所以递归公式为:

dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

 dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j],那么dp[0]就应该是0,因为背包容量为0所背的物品的最大价值就是0。

2.一维dp数组遍历顺序

倒序遍历是为了保证物品i只被放入一次!

代码如下:

for(int i = 0; i < weight.size(); i++) { // 遍历物品for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}
}

 

import java.util.Scanner;public class Main {public static int M;// M 代表研究材料的种类,public static int N;//  N,代表小明的行李空间。public static void main(String[] args) {Scanner sc = new Scanner(System.in);M = sc.nextInt();N = sc.nextInt();int[] wight = new int[M];//材料的重量int[] value = new int[M];//材料的价值for (int i = 0; i < M; i++) {wight[i] = sc.nextInt();}for (int i = 0; i < M; i++) {value[i] = sc.nextInt();}int[] dp = new int[N + 1];dp[0] = 0;for (int i = 0; i < M; i++) {for (int j = N; j >= wight[i]; j--) {dp[j] = Math.max(dp[j], dp[j - wight[i]] + value[i]);}}System.out.println(dp[N]);}
}

 

分割等和子集

416. 分割等和子集 - 力扣(LeetCode)

  • 背包的体积为sum / 2
  • 背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值
  • 背包如果正好装满,说明找到了总和为 sum / 2 的子集。
  • 背包中每一个元素是不可重复放入。

dp[j]表示 背包总容量(所能装的总重量)是j,放进物品后,背的最大重量为dp[j]

dp[j]=max(dp[j],dp[j-nums[i]]+nums[i])//nums[i]对应背包问题既是重量也是价值

当dp[j]==j时说明可以找到子集合等于j所以本题判断dp[targrtSum]==targetSum即可(targetSum==sum/2)

class Solution {public boolean canPartition(int[] nums) {int sum=0;int target=0;for (int i = 0; i < nums.length ; i++) {sum+=nums[i];}if(sum%2==1){return false;}target=sum/2;int[] dp = new int[10001];dp[0] = 0;for (int i = 0; i < nums.length; i++) {for (int j = target; j >=nums[i]; j--) {dp[j]=Math.max(dp[j],dp[j-nums[i]]+nums[i]);}}return  dp[target]==target;}
}

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

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

相关文章

Android网络性能监控方案 android线上性能监测

1 Handler消息机制 这里我不会完整的从Handler源码来分析Android的消息体系&#xff0c;而是从Handler自身的特性引申出线上卡顿监控的策略方案。 1.1 方案确认 首先当我们启动一个App的时候&#xff0c;是由AMS通知zygote进程fork出主进程&#xff0c;其中主进程的入口就是Ac…

Mysqld数据库管理

一.Mysqld数据库类型 常用的数据类型 int 整型 无符号[0-4294967296&#xff08;2的32次方&#xff09;-1]&#xff0c;有符号[-2147483648&#xff08;2的31次方&#xff09;-2147483647]float单精度浮点 4字节32位double双精度浮点 8字节64位char固定长度的字符类型…

Matlab基础篇:数据输入输出

前言 数据输入和输出是 Matlab 数据分析和处理的核心部分。良好的数据输入输出能够提高工作效率&#xff0c;并确保数据处理的准确性。本文将详细介绍 Matlab 数据输入输出的各种方法&#xff0c;包括导入和导出数据、数据处理和数据可视化。 一、导入数据 Matlab 提供了多种方…

计算机网络:1概述、2物理层

目录 概述因特网网络、互连网&#xff08;互联网&#xff09;与因特网的区别与关系因特网发展的三个阶段因特网服务提供者&#xff08;Internet Service Provider&#xff0c;ISP&#xff09;因特网的标准化工作因特网的管理结构 三种交换电路交换分组交换报文交换 计算机网络性…

Threejs-09、贴图的加载与环境遮蔽强度设置

1、创建文理加载器 let textureLoader new THREE.TextureLoader();2、加载贴图 // 加载文理 let texture textureLoader.load("./img/image.png") // 加载ao贴图 let aoMap textureLoader.load("./img/image.png");3、创建一个平面 let planeGeomet…

常见日志库NLog、log4net、Serilog和Microsoft.Extensions.Logging介绍和区别

在C#中&#xff0c;日志库的选择主要取决于项目的具体需求&#xff0c;包括性能、易用性、可扩展性等因素。以下是关于NLog、log4net、Serilog和Microsoft.Extensions.Logging的基本介绍和使用示例。 包含如何配置输出日志到当前目录下的log.txt文件及控制台的示例&#xff0c;…

springboot整合sentinel接口熔断

背景 请求第三方接口或者慢接口需要增加熔断处理&#xff0c;避免因为慢接口qps过大导致应用大量工作线程陷入阻塞以至于其他正常接口都不可用&#xff0c;最近项目测试环境就因为一个查询的慢接口调用次数过多&#xff0c;导致前端整个首页都无法加载。 依赖下载 springboo…

网络安全(完整)

WAPI鉴别及密钥管理的方式有两种&#xff0c;既基于证书和基于预共享密钥PSK。若采用基于证书的方式&#xff0c;整个国产包括证书鉴别、单播密钥协商与组播密钥通告&#xff1b;若采用预共享密钥方式&#xff0c;整个国产则为单播密钥协商与组播密钥通告蠕虫利用信息系统缺陷&…

React+TS前台项目实战(十)-- 全局常用组件CopyText封装

文章目录 前言CopyText组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲项目常用复制文本组件封装&#xff0c;这个组件是一个用于拷贝文本的 React 组件&#xff0c;它提供了拷贝&#xff0c;国际化和消息提示的功能 CopyText组件 1. 功能分…

每日一题——Python实现PAT甲级1144 The Missing Number(举一反三+思想解读+逐步优化)四千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度分析 空间复杂度分析 总体空间复杂度&#xff1a;O(N) 总结 我…

端口映射工具下载?

天联是一款强大的端口映射工具&#xff0c;它能够帮助用户实现远程数据采集管理、异地统一管理、随时随地协同办公等多种场景的应用。无论您是医药、餐饮、商超等零售行业的企业&#xff0c;还是需要使用OA、CRM、ERP、财务进销存等系统的企业&#xff0c;甚至是使用视频监控设…

适用于世界上最先进的医疗应用的高压电阻器

我们的电阻器专为用于医疗诊断、治疗和预防的各种产品而设计。从小型植入式和非侵入性设备到大型诊断成像设备&#xff0c;医疗制造商之所以选择 EAK电阻器&#xff0c;是因为操作环境是高电压和磁场&#xff0c;准确性和稳定性至关重要。 EAK 专有的精密打印技术生产出非常适…

如何应对 CentOS 的停更?

文章目录 如何应对 CentOS 的停更&#xff1f;Linux发行版CentOS停更后&#xff0c;我们可选的替代品RHEL LinuxRocky Linux公有云 LinuxDebian 系 Linux 如何应对 CentOS 的停更&#xff1f; Linux发行版 Linux内核是开源的&#xff0c;任何人都可以获取源代码&#xff0c;进…

嵌入式开发实验项目【基于Arduino的智能循迹小车】步进电机版本(含完整可执行详细代码)| 另附:测试行进传感器可用性,测试小车轱辘/轮胎是否可用

“真正的光明决不是永没有黑暗的时间,只是永不被黑暗所掩蔽罢了。真正的英雄决不是永没有卑下的情操,只是永不被卑下的情操所屈服罢了。” 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔…

Hi3861 OpenHarmony嵌入式应用入门--启动流程

目录 BootLoader的启动与运行 Hi3861 RiSC-V boot 启动文件介绍 Loaderboot 启动过程 Flashboot代码介绍 printf串口配置 内核启动任务 BootLoader的启动与运行 Hi3861 RiSC-V boot 启动文件介绍 - Hi3861 的引导程序分为两部分&#xff0c;一部分是在芯片出厂时已经固…

Redis-数据结构-跳表详解

Redis概述 Redis-数据结构-跳表详解 跳表&#xff08;Skip List&#xff09;是一种基于并联的链表结构&#xff0c;用于在有序元素序列中快速查找元素的数据结构。 Redis 中广泛使用跳表来实现有序集合&#xff08;Sorted Set&#xff09;这一数据结构。 1.跳表的基本概念和…

【源码】Spring事务之事务失效及原理

Spring事务 1、【源码】SpringBoot事务注册原理 2、【源码】Spring Data JPA原理解析之事务注册原理 3、【源码】Spring Data JPA原理解析之事务执行原理 4、【源码】SpringBoot编程式事务使用及执行原理 5、【源码】Spring事务之传播特性的详解 6、【源码】Spring事务之…

搜索与人工智能相结合如何解决企业数据问题?

作者&#xff1a;来自 Elastic Fermi Fang 企业数据是好处还是负担&#xff1f; 组织正被数据淹没 —— 从安全事件日志和应用程序错误消息到物联网指标和帮助中心常见问题解答。这些丰富的信息通常存在于孤立的孤岛中&#xff0c;在整合这些信息以提升客户体验、提高运营弹性…

thinkphp5使用模型删除与复杂查询EXP

模型删除 应用软删除 表中需要有字段&#xff0c;deletetime 模型中使用下面方法 use SoftDelete;protected $deleteTime delete_time;真实删除 // 软删除 User::destroy(1); // 真实删除 User::destroy(1,true); $user User::get(1); // 软删除 $user->delete(); // 真…

js 实现将后端请求来的 Blob 数据保存到用户选择的任意目录

js实现将后端请求来的 Blob 数据保存到用户选择的任意目录 实现方式 实现方式 实现方式是使用 window 的 showSaveFilePicker 方法。Window 接口的 showSaveFilePicker() 方法用于显示一个文件选择器&#xff0c;以允许用户保存一个文件。可以选择一个已有文件覆盖保存&#xf…