题解 | #购物单#

购物单

https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner fzhinput = new Scanner(System.in);
        int money = fzhinput.nextInt();
        int num = fzhinput.nextInt();
        int price[] = new int[num + 1];
        int important[] = new int[num + 1];
        int morq[] = new int[num + 1];
        int[][] attach = new int[num + 1][2];
        int i;
        int my[] = new int[money + 1];
        fzhinput.nextLine();
        for (i = 1; i <= num; i++) {
            price[i] = fzhinput.nextInt();
            important[i] = fzhinput.nextInt();
            morq[i] = fzhinput.nextInt();
            if (morq[i] > 0) {
                // 如果是附件,找到对应主件
                if (attach[morq[i]][0] == 0) {
                    attach[morq[i]][0] = i; // 第一个附件
                } else {
                    attach[morq[i]][1] = i; // 第二个附件
                }
            }
        }

       for (i = 1; i <= num; i++) {
            if (morq[i] == 0) { // 处理主件
                // 逆序遍历,保证每个物品只用一次
                for (int j = money; j >= price[i]; j--) {
                    // 仅购买主件
                    my[j] = Math.max(my[j], my[j - price[i]] + price[i] * important[i]);

                    // 买主件 + 第一个附件
                    if (attach[i][0] > 0 && j >= price[i] + price[attach[i][0]]) {
                        my[j] = Math.max(my[j], my[j - price[i] - price[attach[i][0]]] + price[i] * important[i] + price[attach[i][0]] * important[attach[i][0]]);
                    }

                    // 买主件 + 第二个附件
                    if (attach[i][1] > 0 && j >= price[i] + price[attach[i][1]]) {
                        my[j] = Math.max(my[j], my[j - price[i] - price[attach[i][1]]] + price[i] * important[i] + price[attach[i][1]] * important[attach[i][1]]);
                    }

                    // 买主件 + 两个附件
                    if (attach[i][0] > 0 && attach[i][1] > 0 && j >= price[i] + price[attach[i][0]] + price[attach[i][1]]) {
                        my[j] = Math.max(my[j], my[j - price[i] - price[attach[i][0]] - price[attach[i][1]]] + price[i] * important[i] + price[attach[i][0]] * important[attach[i][0]] + price[attach[i][1]] * important[attach[i][1]]);
                    }
                }
            }
        }
        System.out.println(my[money]);

    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-29 12:19
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务