代码随想录算法训练营Day39 | 卡玛网-46.携带研究材料、416. 分割等和子集

目录

卡玛网-46.携带研究材料

416. 分割等和子集

卡玛网-46.携带研究材料

题目

卡玛网46. 携带研究材料(第六期模拟笔试)

题目描述:

小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的空间,并且具有不同的价值。

小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料只能选择一次,并且只有选与不选两种选择,不能进行切割。

输入描述:

第一行包含两个正整数,第一个整数 M 代表研究材料的种类,第二个正整数 N,代表小明的行李空间。

第二行包含 M 个正整数,代表每种研究材料的所占空间。

第三行包含 M 个正整数,代表每种研究材料的价值。

输出描述:

输出一个整数,代表小明能够携带的研究材料的最大价值。

输入示例:

6 1
2 2 3 1 5 2
2 3 1 5 4 3

输出示例:

5

提示信息:

小明能够携带 6 种研究材料,但是行李空间只有 1,而占用空间为 1 的研究材料价值为 5,所以最终答案输出 5。

数据范围:
1 <= N <= 5000
1 <= M <= 5000
研究材料占用空间和价值都小于等于 1000

思路

代码随想录:背包理论基础-01背包-1

视频讲解1:带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!

代码随想录:背包理论基础-01背包-2

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

例子:

背包最大重量为4。

物品为:

重量价值
物品0115
物品1320
物品2430

二维数组:

动态规划五部曲:

1:确定dp数组以及下标含义:使用二维数组,两个维度分别表示物品和背包容量,纵向表示物品,横向表示背包容量:

动态规划-背包问题1

dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为 j 的背包之后最大的价值总和。

2:确定递推公式:求取dp[i][j]有两种情况,向背包中放入或者不放入物品 i,如果不放入物品 i,则当前情况下物品最大价值等于dp[i-1][j];如果放入物品 i,首先注意背包要留出物品 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:初始化数组:首先,背包容量为 0 时,背包价值一定为0,因此初始化dp[i][0] = 0;由递推公式可知dp[i][j]需要从dp[i-1][j]进行推导,所以还要初始化i = 0的情况,当j < weight[i]时,初始化dp[0][j] = 0j > weight[i]时,初始化dp[0][j] = value[i]。其余下标的值最终都会被递推结果覆盖,所以初始化为任意值都可以。最终初始化情况如下:

动态规划-背包问题10

4:确定遍历顺序:由递归公式可知dp[i][j]由其左上角和正上方的两个下标决定,所以从左往右,从上往下遍历即可,选择先遍历物品,后遍历背包容量或者相反顺序都可以。

5:举例推导:

动态规划-背包问题4

滚动数组:

在二维数组遍历时可以将每一层的结果拷贝到下一层之中,然后递推公式也可以只在本层进行,等效于只使用了一个滚动数组保存结果。

动态规划五部曲:

1:确定dp数组以及下标含义:dp[j]表示容量为 j 的背包可以放入的最大的物品价值。

2:确定递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]),即在二维数组的公式基础上去掉 i 维度。

3:初始化数组:由于物品价值都大于0,为了不让初始值覆盖掉 dp 数组的取值,全部初始化为 0 即可。

4:确定遍历顺序:遍历时背包容量从大到小,为了保证每一个物品都只会被放入背包一次,如果使用正序遍历,每个物品都会被重复放入背包多次,可以写出正序遍历代码自己测试。

5:举例推导:

动态规划-背包问题9

题解

二维数组:

import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int M = scanner.nextInt(); // 研究材料的种类int N = scanner.nextInt(); // 行李空间int[] weight = new int[M]; // 每种研究材料所占空间int[] value = new int[M]; // 每种研究材料的价值for (int i = 0; i < M; i++) {weight[i] = scanner.nextInt();}for (int i = 0; i < M; i++) {value[i] = scanner.nextInt();}scanner.close();int[][] dp = new int[M][N + 1];//初始化dp数组for (int i = 0; i < M; i++) {dp[i][0] = 0;}for (int i = weight[0]; i < N + 1; i++) {dp[0][i] = value[0];}//从左到右,从上到下遍历for (int i = 1; i < M; i++) {for (int j = 1; j < N + 1; j++) {if (j - weight[i] >= 0) {dp[i][j] = Math.max(dp[i - 1][j - weight[i]] + value[i], dp[i - 1][j]);} else {dp[i][j] = dp[i - 1][j];}}}System.out.println(dp[M - 1][N]);}
}

滚动数组:

import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int M = scanner.nextInt(); // 研究材料的种类int N = scanner.nextInt(); // 行李空间int[] weight = new int[M]; // 每种研究材料所占空间int[] value = new int[M]; // 每种研究材料的价值for (int i = 0; i < M; i++) {weight[i] = scanner.nextInt();}for (int i = 0; i < M; i++) {value[i] = scanner.nextInt();}scanner.close();int[] dp = new int[N + 1];for (int i = 0; i < M; i++) {for (int j = N; j > 0; j--) {if (j - weight[i] >= 0) {dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);}}}System.out.println(dp[N]);}
}

416. 分割等和子集

题目

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

给你一个 只包含正整数非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

示例 1:

输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。

示例 2:

输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 100

思路

视频讲解:LeetCode:416.分割等和子集

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

确定以下四点后才能在本题套用01背包模板:

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

动态规划五部曲:

  1. 确定dp数组以及下标的含义:dp[j] 表示容量为 j 的背包能放的最大物品价值,当dp[target] = target时,说明可以进行分割。
  2. 确定递推公式:套用01背包递推公式,dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
  3. 初始化数组:数组元素全都初始化为0。
  4. 确定遍历顺序:遍历物品的 for 循环放在外层,遍历背包的 for 循环放在内层,且内层 for 循环倒序遍历。
  5. 举例推导:

416.分割等和子集2

题解

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

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

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

相关文章

day3:管道,解压缩,vim

一&#xff0c;管道&#xff08;|&#xff09; 引入 当我们要将本次命令结果作为下次命令参数时就可以用到&#xff0c;极大的简化了操作。 比如&#xff1a;head -5 文件| tail -1&#xff1a;表示显示第五行这就是管道的魅力 概述 管道符&#xff1a;| 作用&#xff1a…

【论文阅读】ESRGAN+

学习资料 论文题目&#xff1a;进一步改进增强型超分辨率生成对抗网络&#xff08;ESRGAN : FURTHER IMPROVING ENHANCED SUPER-RESOLUTION GENERATIVE ADVERSARIAL NETWORK&#xff09;论文地址&#xff1a;2001.08073代码&#xff1a;ncarraz/ESRGANplus&#xff1a; ICASSP …

Android中的epoll机制

深入理解Android中的epoll机制 在Android系统中&#xff0c;epoll广泛用于高效管理网络和文件的I/O操作。它通过减少CPU资源消耗和避免频繁的内核态-用户态切换&#xff0c;实现了在多连接、多任务环境中的高性能。epoll的特性使其非常适合Android系统中网络服务器、Socket通信…

Android 15自定义设置导航栏与状态栏,EdgeToEdge适配

背景&#xff1a;android api 35&#xff0c;activity设置EdgeToEdge.enable((ComponentActivity) this)前提下 一、设置导航栏与状态栏颜色 设置的状态栏颜色&#xff0c;只需要设置fitsSystemWindows跟setOnApplyWindowInsetsListener xml设置&#xff1a; 代码&#xff1a;…

比例数据可视化(Python实现板块层级图绘制)——Instacart Market Basket Analysis

【实验名称】 实验一&#xff1a;绘制板块层级图 【实验目的】 1. 掌握数据文件读取 2. 掌握数据处理的方法 3. 实现板块层级图的绘制 【数据介绍】Instacart Market Basket Analysis 1. 数据说明 数据共有300 0000orders&#xff0c; 20 0000users&#xff0c; …

logback日志脱敏后异步写入文件

大家项目中肯定都会用到日志打印&#xff0c;目的是为了以后线上排查问题方便&#xff0c;但是有些企业对输出的日志包含的敏感(比如&#xff1a;用户身份证号&#xff0c;银行卡号&#xff0c;手机号等)信息要进行脱敏处理。 哎&#xff01;我们最近就遇到了日志脱敏的改造。可…

使用text-embedding-3-small生成向量并将向量插入Mlivus Cloud用于语义搜索的深度解析与实战操作

使用text-embedding-3-small生成向量并将向量插入Mlivus Cloud用于语义搜索的深度解析与实战操作 在当今的大数据时代,文本数据的处理与分析显得尤为重要。如何高效地存储、查询和理解这些海量文本数据,成为了许多企业和研究机构面临的重大挑战。幸运的是,随着向量数据库技…

校园表白墙源码修复版

此校园表白墙源码基于thinkphp&#xff0c;因为时代久远有不少bug&#xff0c;经本人修复已去除大部分bug&#xff0c;添加了美化元素。 https://pan.quark.cn/s/1f9b3564c84b https://pan.baidu.com/s/1bb9vu9VV2jJoo9-GF6W3xw?pwd7293 https://caiyun.139.com/m/i?2hoTc…

用更多的钱买电脑而不是手机

如果&#xff0c;我们对自己的定义是知识工作者&#xff0c;那么在工作、学习相关的电子设备投入上&#xff0c;真的别舍不得花钱。 需要留意的是&#xff0c;手机&#xff0c;对于大部分在电脑前工作的人&#xff0c;不是工作设备。在我看来&#xff0c;每年投入到电脑的钱&…

【Java】java 集合框架(详解)

&#x1f4c3;个人主页&#xff1a;island1314 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 1. 概述 &#x1f680; &#x1f525; Java集合框架 提供了一系列用于存储和操作…

GeoWebCache1.26调用ArcGIS切片

常用网址&#xff1a; GeoServer GeoWebCache (osgeo.org) GeoServer 用户手册 — GeoServer 2.20.x 用户手册 一、版本需要适配&#xff1a;Geoserver与GeoWebCache、jdk等的版本适配对照 ​ 查看来源 二、准备工作 1、数据&#xff1a;Arcgis标准的切片&#xff0c;通过…

前OpenAI首席技术官为新AI初创公司筹资;我国发布首个应用临床眼科大模型 “伏羲慧眼”|AI日报

文章推荐 2024人工智能报告.zip &#xff5c;一文迅速了解今年的AI界都发生了什么&#xff1f; 今日热点 据报道&#xff0c;前OpenAI首席技术官Mira Murati正在为一家新的AI初创公司筹集资金 据路透社报道&#xff0c;上个月宣布离职的OpenAI首席技术官Mira Murati正在为一…

2024年妈杯MathorCup大数据竞赛A题超详细解题思路

2024年妈杯大数据竞赛初赛整体难度约为0.6个国赛。A题为台风中心路径相关问题&#xff0c;为评价预测问题&#xff1b;B题为库存和销量的预测优化问题。B题难度稍大于A题&#xff0c;可以根据自己队伍情况进行选择。26日早六点之前发布AB两题相关解题代码论文。 下面为大家带来…

excel斜线表头

检验数据验证对象 鼠标放在检验数据 验证对象中间&#xff0c;altenter 之后空格 选中格子&#xff0c;右键单元格格式&#xff0c; 完成 如果是需要多分割&#xff0c;操作一样&#xff0c;在画斜线的时候会有区别&#xff0c;在插入里面用直线画斜线即可 在表格插入的时…

el-table相关的功能实现

1. 表格嵌套表格时&#xff0c;隐藏父表格的全选框 场景&#xff1a;当table表格设置复选&#xff08;多选&#xff09;功能时&#xff0c;如何隐藏表头的复选框&#xff0c;不让用户一键多选。 <el-table :header-cell-class-name"cellClass">// 表头复选框禁…

基于Springboot无人驾驶车辆路径规划系统(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

雷赛L6N伺服驱动器基本参数设置——EtherCAT 总线型

1、指令脉冲设置 PA0.08代表电机转一圈&#xff0c;所需要的指令脉冲数&#xff0c;该值驱动器默认值为0&#xff0c;该值更改后断电重启后生效。 2、编码器反馈脉冲设置 PA0.11&#xff0c;代表编码器输出每转脉冲数&#xff0c;实际反馈的脉冲数做了4倍频处理&#xff0c;设…

CSS揭秘:7. 伪随机背景

前置知识&#xff1a;CSS 渐变&#xff0c;5. 条纹背景&#xff0c;6. 复杂的背景图案 前言 本篇主要内容依然是关于背景的&#xff0c;无限平铺的背景会显得整齐美观&#xff0c;但又有些呆板&#xff0c;如何实现背景的多样性和随机性&#xff0c;是本篇的核心。 一、四种颜…

LTSC版本的Windows系统没有默认图片查看工具和便笺?教你下载。

前言 最近小白在使用Windows 11 LTSC版本&#xff0c;感觉真的是嘎嘎好用。 终于等到了&#xff01;旧电脑福星——最干净的Win11官方原版系统 小白用来安装这个系统的电脑配置其实也不低&#xff1a; i5-12400&#xff08;核显输出&#xff09; 16GB DDR4 3200MHz 500GB …

植物健康,Spring Boot来助力

3系统分析 3.1可行性分析 通过对本植物健康系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本植物健康系统采用SSM框架&#xff0c;JAVA作为开发语言&#…