代码随想录算法训练营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…

基于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的用法 我们在平时…

博弈论 C++

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

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…

使用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开…

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

未来汽车驾驶还会有趣吗&#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;一但发生而没有提前预告将给人民的生命财产和社会危害产生严重影响。对高边坡可能产生的灾害提前预警、必将有利于决策者采取应对措施、减少和降低灾害造成的损失。现有的高边坡监测技术有人工巡查和利用测…

python3的基本数据类型:字符串的其他操作

一. 简介 前面文章学习了 python3 中字符串的创建&#xff0c;连接与转化。文章如下&#xff1a; 本文继续来学习 python3 中字符串的其他操作。 二. python3 的基本数据类型&#xff1a;字符串的其他操作 1. 字符转义 python3 中使用反斜杠 \ 转义特殊字符&#xff0c;它…

Docker 搭建mysql

拉取mysql镜像 docker pull mysql # 拉取镜像 [rooteason ~]# docker pull mysql Using default tag: latest latest: Pulling from library/mysql 72a69066d2fe: Pull complete 93619dbc5b36: Pull complete 99da31dd6142: Pull complete 626033c43d70: Pull complete 37d…

JavaEE----多线程(二)

文章目录 1.进程的状态2.线程的安全引入3.线程安全的问题产生原因4.synchronized关键字的引入4.1修饰代码块4.2修饰实例方法4.3修饰静态方法4.4对象头介绍4.5死锁-可重入的特性 5.关于死锁的分析总结5.1死锁的分析5.2死锁成因的必要条件5.3死锁的解决方案 1.进程的状态 public…

网站被浏览器提示“不安全”,如何快速解决

当网站被浏览器提示“不安全”时&#xff0c;这通常意味着网站存在某些安全隐患&#xff0c;需要立即采取措施进行解决。 一、具体原因如下&#xff1a; 1.如果网站使用的是HTTP协议&#xff0c;应立即升级HTTPS。HTTPS通过使用SSL证书加密来保护数据传输&#xff0c;提高了网…

leetcode 504.七进制数

1.题目要求: 2.题目代码: class Solution { public:string convertToBase7(int num) {string s;int n abs(num);if(num 0){s.push_back(0);return s;}//采用迭代法&#xff0c;对基数进行求余while(n){s.push_back(n % 7 0);n / 7;}if(num < 0){s.push_back(-);}//反转字…

java对接U9C接口

使用java对接U9C的svn接口&#xff0c;说起来也不复杂&#xff0c;走过了路才敢这么说&#xff0c;大致步骤如下&#xff1a; 1.找到接口地址 http://U9地址/Services/***.svc,打开接口地址&#xff0c;如下显示为正常 2.确定需要的参数 接口开发前需要大致了解哪些是必须的…

Flux危,SD 3.5王者归来!个人可以免费商用!

StabilityAI最新发布了Stable Diffusion 3.5&#xff0c;这次公开发布包括多个模型&#xff0c;包括Stable Diffusion 3.5 Large和Stable Diffusion 3.5 Large Turbo。此外&#xff0c;Stable Diffusion 3.5 Medium将于10月29日发布。这些模型因其大小而具有高度的可定制性&…

状态栏黑底白字后如何实现圆角以及固定状态栏

如何实现如下效果: 上述是将状态栏实现黑底白字+圆角+状态栏固定的逻辑 具体代码patch如下: From 6a3b8ed5d3f49a38d8f9d3e488314a66ef5576b8 Mon Sep 17 00:00:00 2001 From: andrew.hu <andrew.hu@quectel.com> Date: Fri, 18 Oct 2024 16:43:49 +0800 Subject: [P…