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

1. LeetCode 01背包问题 二维

题目链接:https://kamacoder.com/problempage.php?pid=1046
文章链接:https://programmercarl.com/背包理论基础01背包-1.html#算法公开课
视频链接:https://www.bilibili.com/video/BV1cg411g7Y6/

在这里插入图片描述

思路:
01背包问题

  1. 定义dp数组 dp[i][j]表示在0~i物品内任意选择,放入j空间大小的背包中的最大价值
    int[][] dp = new int[M][N+1];
  2. 递推公式
    dp[i][j] =
    Math.max(dp[i-1][j],dp[i-1][j-Integer.valueOf(space[i])]+Integer.valueOf(value[i]))
  3. 初始化
    for (int j=Integer.valueOf(space[0]);j<=N;j++) {
    dp[0][j] = Integer.valueOf(value[0]);
    }
  4. 遍历顺序 先物品再空间

注意:
1️⃣若当前背包的容量都没有当前物品i大的时候,是不放物品i的。那么前i-1个物品能放下的最大价值就是当前情况的最大价值;
2️⃣若当前背包的容量可以放下物品i
那么此时分两种情况:
1、不放物品i
2、放物品i
比较这两种情况下,哪种背包中物品的最大价值最大

import java.util.*;// 01背包问题
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] firLine = sc.nextLine().split(" ");String[] space = sc.nextLine().split(" ");String[] value = sc.nextLine().split(" ");int M = Integer.valueOf(firLine[0]); // 物品数量int N = Integer.valueOf(firLine[1]); // 背包空间// 1. 定义dp数组 dp[i][j]表示在0~i物品内选择j空间的最大价值int[][] dp = new int[M][N+1];// 2. 递推公式// dp[i][j] = Math.max(dp[i-1][j],// dp[i-1][j-Integer.valueOf(space[i])]+Integer.valueOf(value[i]))// 3. 初始化for (int j=Integer.valueOf(space[0]);j<=N;j++) {dp[0][j] = Integer.valueOf(value[0]);}// 4. 遍历顺序 先物品再空间for (int i=1;i<M;i++) {for (int j=0;j<N+1;j++) {if (j < Integer.valueOf(space[i])) {dp[i][j] = dp[i-1][j];} else {dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-Integer.valueOf(space[i])]+Integer.valueOf(value[i]));}}}System.out.println(dp[M-1][N]);}
}

2. LeetCode 01背包问题 一维

题目链接:https://kamacoder.com/problempage.php?pid=1046
文章链接:https://programmercarl.com/背包理论基础01背包-2.html#思路
视频链接:https://www.bilibili.com/video/BV1BU4y177kY/

思路:
01背包问题

  1. 确定dp数组的定义
    在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。
  2. 一维dp数组的递推公式
    dp[j]有两个选择:
    (1)不放物品i:取自己dp[j],相当于 二维dp数组中的dp[i-1][j];
    (2)放物品i:取dp[j - weight[i]] + value[i]。
    dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
  3. 一维dp数组如何初始化
    关于初始化,一定要和dp数组的定义吻合,否则到递推公式的时候就会越来越乱。dp[0]应该是0,因为背包容量为0所背的物品的最大价值就是0。
    除了下标0的位置,假设物品价值都是大于0的,所以dp数组初始化的时候,都初始为0就可以了。
  4. 一维dp数组遍历顺序
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]);}// j>=weight[i],即物品i只能放到weight大于该物品重量的背包中。
}// 归根结底,当前物品只可能放入背包重量大于当前物品重量的背包中
import java.util.*;// // 01背包问题
// // 二维数组
// public class Main {
//     public static void main(String[] args) {
//         Scanner sc = new Scanner(System.in);
//         String[] firLine = sc.nextLine().split(" ");
//         String[] space = sc.nextLine().split(" ");
//         String[] value = sc.nextLine().split(" ");
//         int M = Integer.valueOf(firLine[0]); // 物品数量
//         int N = Integer.valueOf(firLine[1]); // 背包空间//         // 1. 定义dp数组 dp[i][j]表示在0~i物品内选择j空间的最大价值
//         int[][] dp = new int[M][N+1];//         // 2. 递推公式
//         // dp[i][j] = Math.max(dp[i-1][j],
//         // dp[i-1][j-Integer.valueOf(space[i])]+Integer.valueOf(value[i]))//         // 3. 初始化
//         for (int j=Integer.valueOf(space[0]);j<=N;j++) {
//             dp[0][j] = Integer.valueOf(value[0]);
//         }//         // 4. 遍历顺序 先物品再空间
//         for (int i=1;i<M;i++) {
//             for (int j=0;j<N+1;j++) {
//                 if (j < Integer.valueOf(space[i])) {
//                     dp[i][j] = dp[i-1][j];
//                 } else {
//                     dp[i][j] = Math.max(dp[i-1][j],
//                     dp[i-1][j-Integer.valueOf(space[i])]+Integer.valueOf(value[i]));
//                 }
//             }
//         }//         System.out.println(dp[M-1][N]);//     }
// }// 一维数组public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] firLine = sc.nextLine().split(" ");String[] space = sc.nextLine().split(" ");String[] value = sc.nextLine().split(" ");int M = Integer.valueOf(firLine[0]); // 物品数量int N = Integer.valueOf(firLine[1]); // 背包空间// 1. 定义dp数组 dp[j]表示空间j的背包的最大价值int[] dp = new int[N+1];// 2. 递推公式// dp[j] = Math.max(dp[j],dp[j-Integer.valueOf(space[i])]+Integer.valueOf(value[i]))// 3. 初始化// 4. 遍历顺序 先物品再空间for (int i=0;i<M;i++) {for (int j=N;j>=Integer.valueOf(space[i]);j--) {dp[j] = Math.max(dp[j],dp[j-Integer.valueOf(space[i])]+Integer.valueOf(value[i]));}}System.out.println(dp[N]);}
}

3. LeetCode 416. 分割等和子集

题目链接:https://leetcode.cn/problems/partition-equal-subset-sum/description/
文章链接:https://programmercarl.com/0416.分割等和子集.html
视频链接:https://www.bilibili.com/video/BV1rt4y1N7jE/

在这里插入图片描述

思路:此题是01背包应用类题。
题目中物品是nums[i],重量是nums[i],价值也是nums[i],背包体积是sum/2。
只有确定了如下四点,才能把01背包问题套到本题上来。
1.背包的体积为sum / 2
2.背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值
3.背包如果正好装满,说明找到了总和为 sum / 2 的子集。
4.背包中每一个元素是不可重复放入。

解法:
class Solution {public boolean canPartition(int[] nums) {int sum = 0;for (int i=0;i<nums.length;i++) {sum += nums[i];}if (sum%2==1) return false;int N = sum/2;//1. 定义dp数组 dp[j] 表示 容量j的背包所能获取的最大的物品价值// 注意:这里物品的重量=物品的价值。最大的物品价值=最大的物品重量int[] dp = new int[N+1];//2.递推公式//dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i]);//3.初始化//4.遍历顺序 先物品再背包for (int i=0;i<nums.length;i++) {for (int j=N;j>=nums[i];j--) {dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i]);}}return dp[N]==N;}
}

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

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

相关文章

压缩pdf大小的方法 指定大小软件且清晰

在数字化时代&#xff0c;pdf文件因其良好的兼容性和稳定性&#xff0c;已成为文档分享的主流格式。然而&#xff0c;高版本的pdf文件往往体积较大&#xff0c;传输和存储都相对困难。本文将为您详细介绍几种简单有效的方法&#xff0c;帮助您减小pdf文件的大小&#xff0c;让您…

UML的六大关系---泛化、实现、关联、聚合、组合、依赖

文章目录 前言1. 泛化关系(Generalization)2. 实现关系(Realization)3. ‌关联关系(Association)4. 聚合关系(Aggregation)5. 组合关系(Composition)6. 依赖关系(Dependency)总结 前言 讲到设计模式&#xff0c;就会有 U M L UML UML类图这个东西。 一开始就很难理解各种线啥意…

Android RSA 加解密

文章目录 一、RSA简介二、RSA 原理介绍三、RSA 秘钥对生成1. 密钥对生成2. 获取公钥3. 获取私钥 四、PublicKey 和PrivateKey 的保存1. 获取公钥十六进制字符串1. 获取私钥十六进制字符串 五、PublicKey 和 PrivateKey 加载1. 加载公钥2. 加载私钥 六、 RSA加解密1. RSA 支持三…

CTF-Web习题:2019强网杯 UPLOAD

题目链接&#xff1a;2019强网杯 UPLOAD 解题思路 打开靶场如下图所示&#xff0c;是一个注册和登录界面 那就注册登录一下&#xff0c;发现是一个提交头像的页面&#xff1a; 试了一下只有能正确显示的png图片才能提交成功&#xff0c;同时F12拿到cookie&#xff0c;base6…

树形背包问题

一些题目给定了树形结构&#xff0c;在这个树形结构中选取一定数量的点或边&#xff08;也可能是其他属性&#xff09;&#xff0c;使得某种与点权或者边权相关的花费最大或者最小。解决这类问题&#xff0c;一般要考虑使用树上背包。 树上背包&#xff0c;顾名思义&#xff0c…

Linux 基础开发工具 : Vim编辑器

Vim 是 Linux 和其他类 Unix 系统上广泛使用的文本编辑器之一。它基于更早的 vi 编辑器&#xff0c;但添加了许多增强功能和扩展。Vim 是“Vi IMproved”的缩写&#xff0c;意为“改进的 Vi”&#xff0c;我们常使用Vim编辑器编写c/c代码。 ps&#xff1a;该篇介绍均为最基础介…

Blender中保存透明图片

在Blender中保存透明图片&#xff0c;主要是通过在渲染设置中调整背景透明度&#xff0c;并选择合适的文件格式来保存图像。以下是一个详细的步骤指南&#xff1a; 一、设置渲染属性 打开Blender并加载你想要渲染的模型。在右侧的属性编辑器中&#xff0c;找到并点击“渲染属…

解决Visual studio内报错信息:MSB8036:找不到 Windows SDK 版本问题

问题描述&#xff1a; 找不到WindowsSDK版本&#xff0c;请安装所需版本的Windows SDK&#xff0c;或者在项目属性页中通过右键单击解决方案并选择“重定解决方案目标”来更改SDK版本。 首先&#xff0c;如果你尝试了以下两种方法&#xff1a; &#xff08;1&#xff09;重新…

【Qt】 FFmpeg+Qt windows 32位或者64位环境搭建

简介 目前Ffmpeg官网&#xff08;64位连接&#xff09;下载的均为64位编译的&#xff0c;这要求我们采用的Qt creator也采用64位编译器。但是仍存在部分用户采用32位编译器&#xff0c;所以这部分用户需下载32 Ffmpeg&#xff08;32位连接&#xff09;。 根据使用的编译器位数…

Linux下安装Redis(超简单)

1.下载 选着自己需要下载的版本后&#xff0c;右击选择复制链接&#xff0c;然后利用命令进行下载&#xff0c;进入Xshell控制台&#xff0c;输入wget将复制的链接粘帖上&#xff0c;这里我选择的是6.0.6版本。 命令如下&#xff1a; wget https://download.redis.io…

7款主流大模型实测:简单的数感测试全翻车

实测strawberry中有2个字母“r”&#xff1f;不会比大小的大模型也几乎数不对数&#xff0c;数理能力差到惊人&#xff01; 科技新知 原创 谁能想到&#xff0c;号称“超级大脑”的大模型&#xff0c;竟然在几道简单的数学题上败给了小学生。 近日&#xff0c;国内火热的音乐…

Vue.js 2 项目实战(三):综合案例-小黑记事本

前言 Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。它的设计目标是通过采用易于上手的结构和强大的功能&#xff0c;使前端开发变得更加简便和高效。以下是 Vue.js 的一些关键特性和优点&#xff1a; 核心特性 声明式渲染 Vue.js 使用声明式语法来描述用户界面&a…

HR怎么看待PMP证书呢?

不是HR&#xff0c;但 HR 的招人标准也是根据市场跟岗位需求来的吧。据我了解&#xff0c;PMP 证书目前还是有市场的&#xff0c;大家可以根据自己的行业跟公司&#xff0c;去判断下 PMP 的含金量&#xff0c;看自己是否需要去考。一定要结合自己的需求分析&#xff0c;盲目跟风…

【QT】定时器事件 - QTimerEvent QTimer

qt 系统 - 定时器 定时器1. QTimerEvent2. QTimer3. 获取系统日期及时间 定时器 Qt 中在进行窗口程序的处理过程中&#xff0c;经常要周期性的执⾏某些操作&#xff0c;或者制作⼀些动画效果&#xff0c;使用定时器就可以实现。所谓定时器就是在间隔⼀定时间后&#xff0c;去执…

EXO项目解析:pynvml怎么实现监控的,包括什么参数

目录 pynvml怎么实现监控的,包括什么参数 pynvml实现监控的方式 pynvml包括的主要参数 GPU功耗的组成 举例说明 注意事项 EXO项目解析:https://github.com/exo-explore/exo?tab=readme-ov-file 这段代码是一个使用setuptools库编写的Python包安装脚本,主要用于定义和…

GIT命令学习 一

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

【Git】(基础篇六)—— 发现好项目

发现github上的好项目 在开源社区中&#xff0c;发现好的项目&#xff0c;不论是对于自己的学习&#xff0c;还是在前人的基础上继续改进&#xff0c;都十分重要&#xff0c;本文为你介绍如何在github上面找到好的项目&#xff08;gitee同理&#xff09; 关注活跃大牛 GitHu…

ARM架构(二)—— arm v7-a/v8/v9寄存器介绍

1、ARM v7-A寄存器 1.1 通用寄存器 V7 V8开始 FIQ个IRQ优先级一样&#xff0c; 通用寄存器&#xff1a;31个 1.2 程序状态寄存器 CPSR是程序状态毒存器&#xff0c;保存条件标志位&#xff0c;中断禁止位&#xff0c;当前处理器模式等控制和状态位。每种异常模式下还存在SPS…

实现接口幂等性的8种解决方案

古语云&#xff1a;“一而再&#xff0c;再而三&#xff0c;其效不二” 俗语讲&#xff1a;被虐千百遍&#xff0c;依然如初恋 数学符号&#xff1a;f(f(f(x))) f(x) 即无论操作执行一次还是多次&#xff0c;其效果始终如一&#xff0c;不会有差异。这就是幂等性。 文章导读 什…

FPGA-PLL IP核的使用

1.前言 IP核是使用FPGA进行快速开发的一大法宝&#xff0c;FPGA有几个常用的IP核&#xff0c;如今天要写的PLL&#xff0c;即锁相环&#xff0c;还有FIFO&#xff0c;ROM等。熟练使用这些IP核&#xff0c;在一一些大型的项目中会省很多的精力&#xff0c;今天就通过一个实例来…