全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。
真题库:https://www.yuque.com/codernav.com/od
题目:工作安排
知识点循环数组贪心动态规划
时间限制:1s 空间限制:32MB 限定语言:不限
题目描述:
小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时长(单位h)和报酬,工作的总报酬为所有已完成工作的报酬之和。那么请你帮小明安排一下工作,保证小明在指定的工作时间内工作收入最大化。
输入描述:
输入的第一行为两个正整数T,n。T代表工作时长(单位h,0 < T < 100000),n代表工作数量(1 < n ≤ 3000)。
接下来是n行,每行包含两个整数t,w。t代表该项工作消耗的时长(单位h,t > 0),w代表该项工作的报酬。
输出描述:
输出小明指定工作时长内工作可获得的最大报酬。
示例1
输入:
40 3
20 10
20 20
20 5
输出:
30
解题思路:
博主使用了动态规划,大家也可以用其方法。
关键是新建一个长度为T+1的数组。然后动态获取各指定时间内的最大报酬。
代码实现一:
package com.codernav.demo.hwod.exam;
import java.util.Scanner;
/**
* @title 工作安排
* @Description 小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时长(单位h)和报酬,工作的总报酬为所有已完成工作的报酬之和。
* 那么请你帮小明安排一下工作,保证小明在指定的工作时间内工作收入最大化。
* @Author 开发者导航
* @website https://codernav.com
* @date 2023/5/14
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
int n = sc.nextInt();
int[] times = new int[n];
int[] values = new int[n];
for (int i = 0; i < n; i++) {
times[i] = sc.nextInt();
values[i] = sc.nextInt();
}
int res = handle(T, times, values);
System.out.println(res);
}
/**
* 动态规划
*
* @param T 工作时长
* @param times 任务工作数组
* @param values 任务报酬数组
* @return
*/
public static int handle(int T, int[] times, int[] values) {
int[] dp = new int[T + 1]; //相当于各个时间所能做的最大报酬
for (int i = 0; i < times.length; i++) {
for (int j = T; j >= times[i]; j--) {
dp[j] = Math.max(dp[j], dp[j - times[i]] + values[i]);
}
}
return dp[T];
}
}
代码实现二:
package com.codernav.demo.hwod.exam;
import java.util.Scanner;
/**
* @title 工作安排
* @Description 小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时长(单位h)和报酬,工作的总报酬为所有已完成工作的报酬之和。
* 那么请你帮小明安排一下工作,保证小明在指定的工作时间内工作收入最大化。
* @Author 开发者导航
* @website https://codernav.com
* @date 2023/5/14
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
int n = scanner.nextInt();
int[] w = new int[n];
int[] val = new int[n];
for (int i = 0; i < n; i++) {
w[i] = scanner.nextInt();
val[i] = scanner.nextInt();
}
int[][] v = new int[n + 1][t + 1];
for (int i = 1; i < v.length; i++) {
for (int j = 0; j < v[0].length; j++) {
if (w[i - 1] > j) {
v[i][j] = v[i - 1][j];
} else {
v[i][j] = Math.max(v[i - 1][j], val[i - 1] + v[i - 1][j - w[i - 1]]);
}
}
}
System.out.println(v[n][t]);
}
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...
