华为OD笔试题:工作安排 --- 100分 (思路+python代码)

2023-11-17

题目:

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

输入描述:
输入的第一行为两个正整数T,n。T代表工作时长(单位h,0 < T < 100000),n代表工作数量(1 < n ≤ 3000)。
接下来是n行,每行包含两个整数t,w。t代表该项工作消耗的时长(单位h,t > 0),w代表该项工作的报酬。

输出描述:
输出小明指定工作时长内工作可获得的最大报酬。

示例:
输入:
40  3
20  10
20  20
20  5
输出:
30

考查知识点:
动态规划 ------ 01背包(笔试常考点,题库有多道相似题目,一定要加深理解)

思路分析:
本题可以通过二维dp和一维dp两种方法解答。
对于每一项工作应该比较:做该工作(减去该项工作付出的时间,并加上该工作相应报酬)和不做该工作,保留这两种情况收益大的结果。
一维数组优化一定要注意必须从后向前覆盖,来正确计算前面的状态。
建立dp数组要注意(t+1)*(n+1),且遍历时也要从1开始遍历,防止0-1出界。
动态规划问题建议根据代码手动填写一遍dp数组,文字解释往往对理解帮助不大。
背包问题有固定模板,多练习即可掌握。

python代码:(两种解法)
笔试时变量请自行处理

# t:工作总时长,n:工作数量, time:工作时间数组,earnings:工作报酬数组

#解法1:二维dp
def solve1(t, n, time, earnings):  
    dp = [[0] * (t + 1) for _ in range(n + 1)]
    for i in range(1, n + 1):
        for j in range(time[i - 1], t + 1):
            dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - time[i - 1]] + earnings[i - 1])
    return dp[-1][-1]


#解法2:一维dp优化解法
def solve2(t, n, time, earnings):
    dp = [0 for _ in range(t + 1)]
    for i in range(1, n + 1):
        for j in range(t, time[i - 1] - 1, -1):
            dp[j] = max(dp[j], dp[j - time[i - 1]] + earnings[i - 1])
    return dp[-1]


if __name__ == '__main__':
    t = 40
    n = 3
    time = [20, 20, 20]
    earnings = [10, 20, 5]
    res1 = solve1(t, n, time, earnings)
    res2 = solve2(t, n, time, earnings)
    print(res1 == 30)
    print(res2 == 30)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

华为OD笔试题:工作安排 --- 100分 (思路+python代码) 的相关文章

随机推荐

  • 数据库关系代数运算之连接

    联接有三种 联接和自然联接 这里是算术比较符 外联接 1 联接 从R和S的笛卡儿乘积中选取满足条件 i j 的元组 2 自然联接 naturaljoin 两个关系R和S的自然联接操作具体计算过程如下 计算R S 设R和S的公共属性是A1 A
  • 【转】SQL删除的三个语句:DROP、TRUNCATE、 DELETE 的区别

    主要介绍了SQL删除语句DROP TRUNCATE DELETE 的区别 帮助大家更好的理解和学习sql语句 感兴趣的朋友可以了解下 DROP 1 DROP TABLE test 删除表test 并释放空间 将test删除的一干二净 TRU
  • CMake Error: Maybe need administrative privileges.

    安装opencv时 到make install 这一步报错 解决 权限不够 前面加上sudo 即 sudo make install
  • qt中的QString::number()的精度使用问题

    1 QString number average f 5 这里的 f 表示的是 f 方式结果是0 00 所以后面的5表示的就是输出的时候保留5位小数 通常 QString str str QString number 23 34567899
  • 使用tp5内cache缓存,存储手机短信验证码

    设置手机短信验证码缓存方法 设置手机短信验证码缓存 User JW Email jw 333 163 com Date param data cache public function setRegSmsCache data cache C
  • Gitee API的使用|如何批量删除Gitee下的所有仓库

    前言 那么这里博主先安利一些干货满满的专栏了 首先是博主的高质量博客的汇总 这个专栏里面的博客 都是博主最最用心写的一部分 干货满满 希望对大家有帮助 高质量博客汇总https blog csdn net yu cblog category
  • python语音播报

    python3 pip install pyttsx3 python2 pip install pyttsx 文本转语音 import pyttsx3 import time str Come on Catherine engine pyt
  • java 强密码验证策略工具类

    java 强密码验证策略工具类 package com neusoft caeid common utils import java util regex Matcher import java util regex Pattern aut
  • ChatGPT论文考试满绩,高等教育该如何应对人工智能挑战?

    近日 ChatGPT引发热议 一方面 ChatGPT表现亮眼 有大学生利用ChatGPT在开卷课堂上取得满绩的优异成绩 另一方面 部分院校 学术期刊却对ChatGPT在高等教育领域的推进保持谨慎态度 甚至有高校明确禁止这项工具技术的使用 那
  • 算法题:Rod Cutting

    算法题 Rod Cutting 一 题目 二 代码 三 结果 一 题目 二 代码 lengths 1 1 3 4 lengths 5 4 4 2 2 8 def rodOffcut lengths resut resut append le
  • Android自定义控件--如何在XML文件中使用自定义属性

    前言 你好 我是Cici 这几天在做一个小项目的时候 用到了自定义控件 为了方便在XML中进行配置 于是需要用到自定义属性 特此记下用法 方便复习的同时也希望对大家有所帮助 一 为什么需要自定义控件 Android本身提供了很多控件 比如T
  • 1024 视频拼接

    题目描述 你将会获得一系列视频片段 这些片段来自于一项持续时长为 T 秒的体育赛事 这些片段可能有所重叠 也可能长度不一 视频片段 clips i 都用区间进行表示 开始于 clips i 0 并于 clips i 1 结束 我们甚至可以对
  • pyinstaller打包Transformers 报错No such file or directory

    问题描述 Traceback most recent call last File transformers utils import utils py line 1086 in get module File importlib init
  • Go开发者路线图2019,请收下这份指南

    Go是Google开发的一种静态 强类型 编译型 并发型 并具有垃圾回收功能的类C编程语言 2009以开源项目的形式发布 2012年发布1 0稳定版本 距今已经十年了 其性能类似于Java和C 但速度极快 适合搭载于web服务器 用于高性能
  • LeetCode1652. 拆炸弹

    题目描述 1652 拆炸弹 力扣 LeetCode 题目描述看的不是很清楚 直接看用例 这道题是简单题 取模 防止数组访问越界 C语言代码如下 int decrypt int code int codeSize int k int retu
  • 数据分桶

    数据分桶是一种数据预处理技术 用于减少次要观察误差的影响 是一种将多个连续值分组为较少数量的 桶 的方法 例如 例如我们有一组关于人年龄的数据 如下图所示 现在我们希望将他们的年龄分组到更少的间隔中 可以通过设置一些条件来实现 分桶的数据不
  • (Java)leetcode-945 Minimum Increment to Make Array Unique(使数组唯一的最小增量)

    题目描述 给定整数数组 A 每次 move 操作将会选择任意 A i 并将其递增 1 返回使 A 中的每个值都是唯一的最少操作次数 示例 1 输入 1 2 2 输出 1 解释 经过一次 move 操作 数组将变为 1 2 3 示例 2 输入
  • 在ubuntu上搭建文件服务器

    首先需要在ubuntu上下载好文件资源 一共是三个资源 在下载资源之前建议将git和nginx安装好 在本教程中将会用到 ngnix http nginx org download nginx 1 12 2 tar gz 利用winscp上
  • osg学习(五十一)Warning: detected OpenGL error ‘invalid operation‘ at after RenderBin::draw(..)

    原因是什么 这个错误只出现一次 并且是在第一帧时出现 Warning detected OpenGL error invalid operation after applying attribute Viewport 04292398 应该
  • 华为OD笔试题:工作安排 --- 100分 (思路+python代码)

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