华为OD机试-最大报酬-2022Q4 A卷-Py/Java/JS

小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时间(单位h)和报酬,
工作的总报酬为所有已完成工作的报酬之和,那么请你帮小明安排一下工作,保证小明在指定的工作时间内工作收入最大化。
输入描述
输入的第一行为两个正整数T,n。
T代表工作时长(单位h,0 接下来是n行,每行包含两个整数t,w。
t代表该工作消耗的时长(单位h,t>0),w代表该项工作的报酬。
输出描述
输出小明制定工作时长内工作可获得的最大报酬。
示例一
输入

40 3
20 10
20 20
20 5
输出

30

Java 代码

import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;
import java.math.BigInteger;
 
class Main {
    
	public static void main(String[] args) {
        // 处理输入
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();
        int n = in.nextInt();
        int[][] tasks = new int[n][2];
        for (int i = 0; i < n; i++) {
            tasks[i][0] = in.nextInt();
            tasks[i][1] = in.nextInt();
        }
 
        //从耗时最小的任务开始
        int min_time = Integer.MAX_VALUE;
        for (int[] task : tasks) {
            min_time = Math.min(min_time, task[0]);
        }
 
        //dp
        int[][] dp = new int[n + 1][T + 1];
        for (int i = 1; i <= n; i++) {
            for (int j = min_time; j <= T; j++) {
                int last = dp[i - 1][j];
                int current = tasks[i - 1][0] > j ? 0 : tasks[i - 1][1] + dp[i - 1][j - tasks[i - 1][0]];
                dp[i][j] = Math.max(last, current);
            }
        }
        System.out.print(dp[n][T]);
        
    }
 
}

Python代码

import functools
import sys
 
# 处理输入
params = [int(x) for x in input().split(" ")]
T =params[0]
n = params[1]
tasks = []
for i in range(n):
    tasks.append([int(x) for x in input().split(" ")])
 
#从耗时最小的任务开始
min_time = T;
for task in tasks:
    min_time = min(min_time, task[0])
 
#dp
dp = [[0 for x in range(T+1)] for y in range(n+1)]
 
for i in range(n+1):
    for j in range(min_time, T+1):
        last = dp[i - 1][j]
        if tasks[i - 1][0] > j :
            current = 0
        else:
            current = tasks[i - 1][1] + dp[i - 1][j - tasks[i - 1][0]]
        dp[i][j] = max(last, current)
 
print(dp[n][T])

JS代码

function main(T, task_info) {
    //初始化dp
    let dp = new Array(task_info.length + 1).fill(0).map(() => new Array(T + 1).fill(0))
    
    for (let i = 0; i < task_info.length + 1; i++) {
        for (let j = 0; j < T+1; j++) {
            if (i === 0 || j === 0) {
                continue;
            }
            let [t, w] = task_info[i - 1]
            if (t > j) {
                dp[i][j] = dp[i - 1][j];
            } else {
                dp[i][j] = Math.max(dp[i - 1][j], w + dp[i - 1][j - t]);
            }
        }
    }
    
    console.log(dp[task_info.length][T])
}
 
 
main(40,[[20, 10],[20, 20],[20, 5]])

你可能感兴趣的:(java,javascript,华为,python)