华为OD机试-2024年E卷-最大报酬[100分] JAVA

解法:类似01背包的动态规划问题,代码如下

public class OJTest7 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int timeCount = in.nextInt();
        int jobNums = in.nextInt();
        in.nextLine();
        int[] costTimes = new int[jobNums];
        int[] rewards = new int[jobNums];
        for (int i = 0; i < jobNums; i++) {
            String[] inputs = in.nextLine().split(" ");
            costTimes[i] = Integer.parseInt(inputs[0]);
            rewards[i] = Integer.parseInt(inputs[1]);
        }
        calculateReward(jobNums, timeCount, costTimes, rewards);
        calculateReward2(jobNums, timeCount, costTimes, rewards);
    }

    private static void calculateReward(int jobNums, int timeCount, int[] costTimes, int[] rewards) {
        //实际上是一个动态规划的问题,类似01背包问题。 n项工作,选择做哪项或者不做
        //定义一个dp[jobNums+1][timeCount+1], 数组的行代表的是工作时长,从0开始,列代表的是工作的数量,dp[i][j]的值是获得的报酬;
        int[][] dp = new int[jobNums + 1][timeCount + 1];
        for (int i = 1; i < jobNums + 1; i++) {
            for (int j = 1; j < timeCount + 1; j++) {
                dp[i][j] = dp[i - 1][j]; // 不选择当前工作的情况
                if (j >= costTimes[i - 1]) {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - costTimes[i - 1]] + rewards[i - 1]);
                }
            }
        }
        System.out.println(dp[jobNums][timeCount]);
    }

    private static void calculateReward2(int jobNums, int timeCount, int[] costTimes, int[] rewards) {
        //一维dp解法
        int[] dp = new int[timeCount + 1];
        for (int i = 0; i < jobNums; i++) {
            for (int j = timeCount; j >= costTimes[i]; j--) { //倒序遍历的原因是外层i记录的dp上一轮的计算结果不会被覆盖,正序覆盖计算结果就不对了,二维dp可以正序
                dp[j] = Math.max(dp[j], dp[j - costTimes[i]] + rewards[i]);
            }
        }
        System.out.println(dp[timeCount]);
    }
}

全部评论

相关推荐

第二题给你一个坐标x,y。问从0,0像素点的左下角到x,y像素点的右上角经过多少个像素点。大家做了几道题```javaimport&nbsp;java.util.Scanner;//&nbsp;注意类名必须为&nbsp;Main,&nbsp;不要有任何&nbsp;package&nbsp;xxx&nbsp;信息public&nbsp;class&nbsp;Main&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scanner&nbsp;in&nbsp;=&nbsp;new&nbsp;Scanner(System.in);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;注意&nbsp;hasNext&nbsp;和&nbsp;hasNextLine&nbsp;的区别&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x&nbsp;=&nbsp;in.nextInt();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y&nbsp;=&nbsp;in.nextInt();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;RuntimeException&nbsp;runtimeException&nbsp;=&nbsp;new&nbsp;RuntimeException(x+&amp;quot;&nbsp;&amp;quot;+y);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;throw&nbsp;runtimeException;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(x&nbsp;==&nbsp;y)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(x&nbsp;+&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(y&nbsp;&gt;&nbsp;x)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;temp&nbsp;=&nbsp;x;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;y;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;=&nbsp;temp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;gcd&nbsp;=&nbsp;get(x&nbsp;+&nbsp;1,&nbsp;y&nbsp;+&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(gcd&nbsp;==&nbsp;1)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(x&nbsp;+&nbsp;y&nbsp;+&nbsp;1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;temp&nbsp;=&nbsp;(x&nbsp;+&nbsp;1)&nbsp;/&nbsp;gcd&nbsp;-&nbsp;1&nbsp;+&nbsp;(y&nbsp;+&nbsp;1)&nbsp;/&nbsp;gcd&nbsp;-&nbsp;1&nbsp;+&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(temp&nbsp;*&nbsp;gcd);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;int&nbsp;get(int&nbsp;x,&nbsp;int&nbsp;y)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(y&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;x;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;get(y,&nbsp;x&nbsp;%&nbsp;y);&nbsp;&nbsp;&nbsp;&nbsp;}}```
查看1道真题和解析 投递网易雷火等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务