华为OD机试 - 最大报酬 - 0/1 背包问题,动态规划(Java 2024 E卷 100分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

小明每周上班都会拿到自己的工作清单,工作清单内包含 n 项工作,每项工作都有对应的耗时时间(单位 h)和报酬,工作的总报酬为所有已完成工作的报酬之和。那么请你帮小明安排一下工作,保证小明在指定的工作时间内工作收入最大化。

二、输入描述

输入的第一行为两个正整数 T, n。

T 代表工作时长(单位 h,0<T<1000000),n 代表工作数量(1<n≤3000)。

接下来是 n 行,每行包含两个整数 t, w。

t 代表该工作消耗的时长(单位 h,t>0),w 代表该项工作的报酬。

三、输出描述

输出小明制定工作时长内工作可获得的最大报酬。

四、测试用例

1、输入

50 4
10 60
20 100
30 120
40 240

2、输出

300

3、说明

总工作时长 T = 50,有 4 个工作。

工作 1:耗时 10 小时,报酬 60
工作 2:耗时 20 小时,报酬 100
工作 3:耗时 30 小时,报酬 120
工作 4:耗时 40 小时,报酬 240

最佳选择是完成工作 1 和工作 4,总耗时为 10 + 40 = 50,总报酬为 60 + 240 = 300。虽然也可以选择其他工作组合,但报酬无法超过 300。

五、解题思路

基于经典的 0/1 背包问题,该问题可以用动态规划(Dynamic Programming, DP)来解决。

1、0/1 背包问题 & 动态规划

0/1 背包问题的本质是:给定一组物品,每个物品都有一个重量和一个价值,在限定总重量的情况下,选择一部分物品放入背包,使得这些物品的总价值最大。关键在于每个物品只能选择放或不放(即 0 或 1)。

动态规划是一种算法思想,它的本质是通过将问题分解为更小的子问题,并保存每个子问题的解,以此来避免重复计算并获得问题的最优解。

2、为什么采用 0/1 背包问题?

在题目中,我们要在一个固定的总工作时间内,选择一些工作完成,目的是最大化总报酬。这个问题与 0/1 背包问题非常相似:

  1. 背包的容量对应于总的可用工作时间。
  2. 每个物品的重量对应于每个工作的耗时时间。
  3. 每个物品的价值对应于每个工作的报酬。
  4. 选择物品放入背包对应于选择完成某个工作。

目标是选择一些工作,在不超过总时间的情况下,使得获得的报酬最大。

3、动态规划的应用

为了最大化总报酬,我们可以使用动态规划的思想:

  1. 定义状态:定义一个一维数组 dp[i],表示在总时间不超过 i 的情况下,能够获得的最大报酬。
  2. 状态转移方程:
    • 对于每一个工作 (t, w)(表示该工作需要时间 t,报酬为 w),我们可以选择是否完成它。
    • 如果选择完成这个工作,那么总时间就减少 t,报酬增加 w,因此状态转移方程是:dp[i]=max(dp[i],dp[i−t]+w)
    • 如果不选择这个工作,dp[i] 保持不变。
  3. 初始化:
    • 初始化 dp[0] = 0,表示当时间为 0 时,报酬为 0。
  4. 最终结果:
    • 最终,我们求得 dp[T](T 是总的工作时长)即为最大报酬。

4、为什么从后往前更新

从后向前更新 dp 数组是为了确保每个工作只被计算一次。这样可以避免在同一轮次中多次使用同一个工作。

5、复杂度分析

时间复杂度:O(n * T),其中 n 是工作数量,T 是总工作时长。

空间复杂度:O(T),仅使用一维数组 dp。

六、Java算法源码

public class OdTest01 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 输入工作时长 T 和工作数量 nint T = sc.nextInt();int n = sc.nextInt();// 初始化动态规划数组 dpint[] dp = new int[T + 1];// 读取每个工作的耗时时间 t 和报酬 wfor (int i = 0; i < n; i++) {int t = sc.nextInt();int w = sc.nextInt();// 从后向前遍历,更新 dp 数组for (int j = T; j >= t; j--) {dp[j] = Math.max(dp[j], dp[j - t] + w);}}// 输出结果System.out.println(dp[T]);sc.close();}
}

七、效果展示

1、输入

40 3
20 10
20 20
20 5

2、输出

30

3、说明

给定的总时间为 40,有 3 个工作:

工作 1:耗时 20 小时,报酬 10
工作 2:耗时 20 小时,报酬 20
工作 3:耗时 20 小时,报酬 5

最佳选择是完成工作 1 和工作 2,总时间为 20 + 20 = 40,总报酬为 10 + 20 = 30。

因此,通过动态规划可以得出最优解,最终输出 30。

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

借老系统重构机会我写了个groovy规则引擎

公司老系统的重构计划早就有了&#xff0c;为了对Java硬编码的各种校验规则进行重构&#xff0c;特地参考了相关技术&#xff0c;最终选择了groovy进行了系统的学习&#xff0c;并编写了一个即插即用的轻量级规则引擎。 文章目录 项目背景技术选型groovy的性能groovy脚本执行线…

数据结构---双向链表---循环链表---栈

目录 一、双向链表 1.1.创建双向链表 1.2.头插法 1.3.尾插法 1.4.查询节点 1.5.修改节点 1.6.删除节点 1.7.打印节点 1.8.销毁链表 二、循环链表 2.1.单循环链表 2.2.双循环链表 三、栈 3.1.顺序栈 1.创建栈 2.判断栈是否满 3.判断栈是否为空 4.进栈 5.出栈…

安全升级:Docker部署Redis,启用密码验证

1.在自己选定的目录中创建文件夹 在redis文件夹里面创建&#xff1a;data文件夹和conf文件夹&#xff08;文件夹名称随意&#xff09; 2.在conf文件夹中创建redis.conf文件&#xff1a; vim redis.conf 2.1.redis.conf里面编写内容可以根据官网&#xff08;Index of /releases…

CNN中的注意力机制综合指南:从理论到Pytorch代码实现

注意力机制已经成为深度学习模型&#xff0c;尤其是卷积神经网络&#xff08;CNN&#xff09;中不可或缺的组成部分。通过使模型能够选择性地关注输入数据中最相关的部分&#xff0c;注意力机制显著提升了CNN在图像分类、目标检测和语义分割等复杂任务中的性能。本文将全面介绍…

uniapp video标签无法播放视频

当video标签路径含有中文以及特殊字符视频就会无法播放 解决方法使用encodeURIComponent对路径进行加密处理 videoSrc data.coursewareFile? ${appConfig.apiUrl encodeURIComponent(data.coursewareFile)}: "";最后效果

(go)线性表的顺序存储

闲来无事&#xff0c;更新一下&#xff0c;线性表的顺序存储&#xff0c;go语言版本&#xff0c;效果都已经测试过&#xff0c;下面给出各部分细节 文章目录 1、生成一个线性表2、查找3、插入4、求长度5、改值6、删除7、遍历8、测试程序9、完整代码总结 package mainimport &q…

HashMap相关面试题(哈希表、HashMap的实现原理、HashMap的put方法的具体流程、HashMap的扩容机制、HashMap的寻址算法)

文章目录 1. 散列表&#xff08;哈希表&#xff09;1.1 散列表的概念1.2 散列函数1.3 散列冲突1.4 散列冲突-链表法&#xff08;拉链法&#xff09;1.4.1 插入操作1.4.2 查找和删除操作 2. HashMap的实现原理3. HashMap 的 put 方法的具体流程4. HashMap 的扩容机制5. HashMap …

Prometheus监控Kubernetes ETCD

文章目录 一、kubeadm方式部署etcd1.修改etcd指标接口监听地址2.prometheus中添加etcd的服务发现配置3.创建etcd的service4.grafana添加etcd监控模版 二、二进制方式部署k8s etcd1.将etcd服务代理到k8s集群2.创建etcd证书的secrets3.prometheus挂载etcd证书的secrets4.promethe…

【c++】常量周边:常量概念及定义

目录 前言 1.常量是什么&#xff1f; 2.常量的的类型 本质区别&#xff1a; 1&#xff09;文字常量&#xff08;无法取地址&#xff09; &#x1f337;什么是字面值&#xff1f;&#xff1f; 字面值后缀 &#x1f337;文字&#xff08;字面&#xff09;常量的基本类型 …

双指针--优选算法

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、OJ题 前言&#xff1a; 该篇文章我们主要来学习的是双指针算法&#xff0c;对于该类算法我们可以直接来做题&#xff0c;从题中去感知该算法的魅力&#xff0c;最后再从题中做总…

Elasticsearch Suggesters API详解与联想词自动补全应用

Elasticsearch Suggesters API详解与联想词自动补全应用 引言Elasticsearch Suggesters1. Term Suggester实现步骤示例 2. Phrase Suggester示例 3. Completion Suggester创建映射和插入数据查询示例 4. Context Suggester示例 Completion Suggester1. 工作原理2. 使用流程3. 使…

东软 在大健康路上“笨鸟先飞”

若不是东软医疗引入“国家队”通用技术集团作为其最重要的战略投资人&#xff0c;恐怕很多人并不会留意东软“蛰伏”在大健康的赛道上&#xff0c;已有30年。 1997年的一天&#xff0c;沈阳高新技术产业开发区的东大软件园里&#xff0c;创立东软不过6年时间的刘积仁思量着眼前…

并发性服务器

同一时刻能处理多个客户端 多进程&#xff1a; int init_tcp_ser(const char *ip,unsigned short port) {int sockfd socket(AF_INET,SOCK_STREAM,0);if(-1 sockfd){perror("fail socket");return -1;}struct sockaddr_in ser;ser.sin_family AF_INET;ser.sin_por…

tomcat在eclipse中起动成功,无法访问tomcat主页

最近通过geoserver的war包将&#xff0c;geoserver服务部署到了tomcat&#xff0c;发现在eclipse中启动服务后&#xff0c;无法访问localhost&#xff1a;8080主页&#xff0c;geoserver主页&#xff1a;localhost:8080/geoserver/web同样也无法访问。 只需要双击下面的server…

【生成模型系列(初级)】自编码器——深度学习的数据压缩与重构

【通俗理解】自编码器——深度学习的数据压缩与重构 第一节&#xff1a;自编码器的类比与核心概念 1.1 自编码器的类比 你可以把自编码器想象成一个“智能压缩机”&#xff0c;它能够把输入的数据&#xff08;比如图片&#xff09;压缩成一个更小的表示&#xff08;编码&#…

MacOS使用FileZilla通过ssh密钥文件连接远程服务器(已解决)

需求描述 mac电脑,使用filezilla通过FTP连接远程服务器,使用ssh密钥文件代替密码。 版本信息 MacOS:Sonoma 14.5 M3芯片 FileZilla:3.66.5 在这里插入图片描述 连接 1. 创建站点 打开filezilla工具,右上角选择“文件 -> 站点管理器”,打开站点管理器弹窗。 2.…

仿华为车机功能之--修改Launcher3,实现横向滑动桌面空白处切换壁纸

本功能基于Android13 Launcher3 需求:模仿华为问界车机,实现横向滑动桌面空白处,切换壁纸功能(本质只是切换背景,没有切换壁纸)。 实现效果: 实现思路: 第一步首先得增加手势识别 第二步切换底图,不切换壁纸是因为切换壁纸动作太大,需要调用到WallpaperManager,耗…

StringTable

10.1. String的基本特性 String&#xff1a;字符串&#xff0c;使用一对""引起来表示String声明为final的&#xff0c;不可被继承String实现了Serializable接口&#xff1a;表示字符串是支持序列化的。String实现了Comparable接口&#xff1a;表示string可以比较大小…

六. 部署分类器-trt-engine-explorer

目录 前言0. 简述1. 案例运行2. 补充说明3. engine分析结语下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第六章—部署分类器&#xff0c;一起来学习 trt-engine…

更新RK3588开发板的rknn_server和librknnrt.so【这篇文章是RKNPU2从入门到实践 --- 【5】的配套文章】

作者使用的平台有&#xff1a; 一台装有Windows系统的宿主机&#xff0c;在该宿主机上装有Ubuntu 20.04虚拟系统&#xff1b; 瑞芯微RK3588开发板&#xff0c;开发板上的系统为Ubuntu22.04系统&#xff1b; 更新板子的 rknn_server 和 librknnrt.so&#xff0c;rknn_server 和…