代码随想录算法训练营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.mzph.cn/bicheng/57888.shtml

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

相关文章

论文速读:YOLO-G,用于跨域目标检测的改进YOLO(Plos One 2023)

原文标题&#xff1a;YOLO-G: Improved YOLO for cross-domain object detection 中文标题&#xff1a;YOLO-G&#xff1a;用于跨域目标检测的改进YOLO 论文地址&#xff1a; 百度网盘 请输入提取码 提取码&#xff1a;z8h7 代码地址&#xff1a; GitHub - airy975924806/yolo…

使用js-enumerate报错Cannot set properties of undefined

环境 node v16.20.2react 18.3.1react-scripts 5.0.1 按照最新 npx create-react-app my-app 创建出来的新项目&#xff0c;引入 js-enumerate 库后运行报错。 报错 Uncaught runtime errors:ERROR Cannot set properties of undefined (setting Enum) TypeError: Cannot se…

【electron7】调试对话图片的加密处理

1.图片加解密的公共数据&#xff1a;key、iv等 // 字符串转字节数组的方法 const stringToBytes (str: string) > {let ch 0let st []let re: any[] []for (let i 0; i < str.length; i) {ch str.charCodeAt(i) // get charst [] // set up "stack"do …

基于springboot企业微信SCRM管理系统源码带本地搭建教程

系统是前后端分离的架构&#xff0c;前端使用Vue2&#xff0c;后端使用SpringBoot2。 技术框架&#xff1a;SpringBoot2.0.0 Mybatis1.3.2 Shiro swagger-ui jpa lombok Vue2 Mysql5.7 运行环境&#xff1a;jdk8 IntelliJ IDEA maven 宝塔面板 系统与功能介绍 基…

C++ —— 《模板进阶详解》,typename和class的用法,非类型模板参数,模板的特化,模板的分离编译

目录 1.非类型模板参数 2.模板特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 2.3.2 偏特化 3 模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 4.模板总结 在讲解模板进阶之前&#xff0c;我想先简单单独聊聊class和typename的用法 我们在平时…

goalng框架Gin解析

本文通过案例的形式&#xff0c;说明gin框架的基本用法&#xff0c;主要列举后端的案例&#xff0c;前端和相对简单的知识点未在此分析&#xff1b; 过完案例后可以有个基本的印象&#xff1a;就是封装和简便 package mainimport ("fmt""github.com/gin-gonic/…

博弈论 C++

前置知识 若一个游戏满足&#xff1a; 由两名玩家交替行动在游戏进行的任意时刻&#xff0c;可以执行的合法行动与轮到哪位玩家无关不能行动的玩家判负 则称该游戏为一个公平组合游戏。 尼姆游戏&#xff08;NIM&#xff09;属于公平组合游戏&#xff0c;但常见的棋类游戏&…

前端零基础入门到上班:【Day5】HTML 和 CSS

HTML 和 CSS 的完美结合&#xff1a;从基础到进阶 引言 1. HTML 与 CSS 的基础知识1.1 HTML 概述常用标签 1.2 CSS 概述选择器与属性 1.3 HTML 与 CSS 的基本结合 2. HTML 与 CSS 的基本结合2.1 选择器的使用2.1.1 元素选择器2.1.2 类选择器2.1.3 ID 选择器2.1.4 组合选择器 2.…

ASP.NET Core开发Chatbot API

本文介绍基于ASP.NET Core的Chatbot Restful API开发&#xff0c;通过调用大语言模型的SDK&#xff0c;完成一个简单的示例。并且通过容器化进行部署. 安装 首先需要安装.NET环境&#xff0c;笔者在Ubuntu 22.04通过二进制包进行安装&#xff0c;Windows和Mac下都有installer…

终止,半成收入来自海外,收入可持续性被质疑

芬尼科技终止原因如下&#xff1a;芬尼科技4年期间经历了两次IPO失败&#xff0c;公司半成收入来自海外&#xff0c;然而公司泳池收入面临欧洲地区冲突冲击及德国新节能措施影响。交易所质疑其收入是否具有可持续性。 作者&#xff1a;Eric 来源&#xff1a;IPO魔女 9月25日&a…

grafana 和 prometheus

1. 监控 mysql 数据库 使用 Grafana 配合 Prometheus 对 MySQL 数据库进行监控的步骤主要包括配置 Prometheus、MySQL Exporter 和 Grafana。以下是详细的步骤&#xff1a; 1. 安装 MySQL Exporter MySQL Exporter 是一个 Prometheus 的 Exporter&#xff0c;用于从 MySQL 数…

使用HIP和OpenMP卸载的Jacobi求解器

Jacobi Solver with HIP and OpenMP offloading — ROCm Blogs (amd.com) 作者&#xff1a;Asitav Mishra, Rajat Arora, Justin Chang 发布日期&#xff1a;2023年9月15日 Jacobi方法作为求解偏微分方程&#xff08;PDE&#xff09;的基本迭代线性求解器在高性能计算&#xff…

Webserver(2)GCC

目录 安装GCCVScode远程连接到虚拟机编写代码gcc编译过程gcc与g的区别Xftp连接虚拟机上传文件 安装GCC sudo apt install gcc g查看版本是7.5 touch test.c创建代码 但是在虚拟机中写代码很不方便 VScode远程连接到虚拟机编写代码 gcc test.c -o app在虚拟机中用gcc编译的…

AtCoder ABC376A-D题解

个人觉得 ABC 变得越来越难了/kk/kk/kk 比赛链接:ABC376 Problem A: Code #include <bits/stdc.h> using namespace std; int main(){int N,C;cin>>N>>C;for(int i1;i<N;i)cin>>T[i];int ans0,pre-1e5;for(int i1;i<N;i){if(T[i]-pre>C){…

APP专项测试-冷启动-流量-电量-内存

1、响应时间 1.1怎么获取冷启动时间&#xff08;热启动&#xff0c;就是后台不关后台再次打开&#xff09; 方法一 1.2怎么获取包名 与 启动页 方法三soloPi&#xff1a;启动时间(用户角度出发&#xff0c;页面差异进行计算时间)&#xff1a; 然后默认配置。点击开始录制 1开…

今日头条躺赚流量:自动化新闻爬取和改写脚本

构建一个自动化的新闻爬取和改写系统&#xff0c;实现热点新闻的自动整理和发布&#xff0c;需要分为以下几个模块&#xff1a;新闻爬取、信息解析与抽取、内容改写、自动发布。以下是每个模块的详细实现步骤和代码示例&#xff1a; 1. 新闻爬取模块 目标&#xff1a;从新闻网…

leetcode hot100【LeetCode 146. LRU缓存】java实现

LeetCode 146. LRU缓存 题目描述 设计和实现一个 LRU (Least Recently Used) 缓存机制。它应该支持以下操作&#xff1a; get(key)&#xff1a;如果缓存中存在 key&#xff0c;则返回 value&#xff0c;否则返回 -1。put(key, value)&#xff1a;如果缓存已满&#xff0c;移…

未来汽车驾驶还会有趣吗?车辆动力学系统简史

未来汽车驾驶还会有趣吗&#xff1f;车辆动力学系统简史 本篇文章来源&#xff1a;Schmidt, F., Knig, L. (2020). Will driving still be fun in the future? Vehicle dynamics systems through the ages. In: Pfeffer, P. (eds) 10th International Munich Chassis Symposiu…

高边坡稳定安全监测预警系统解决方案

一、项目背景 高边坡的滑坡和崩塌是一种常见的自然地质灾害&#xff0c;一但发生而没有提前预告将给人民的生命财产和社会危害产生严重影响。对高边坡可能产生的灾害提前预警、必将有利于决策者采取应对措施、减少和降低灾害造成的损失。现有的高边坡监测技术有人工巡查和利用测…

Java基础题:循环求水仙花数

所谓水仙花数&#xff0c;是指一个三位数abc&#xff0c;如果满足 a^3b^3c^3abc&#xff0c;则abc 是水仙花数&#xff0c;此处^表示次方。 分析&#xff1a;因为这里求得的是水仙花的3位数&#xff0c;定义一个方法接收3位数&#xff0c;对每一位进行取值&#xff0c;最后进行…