题解 | #购物单#

购物单

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]);

    }
}

全部评论

相关推荐

码农索隆:单休一个月少休息4天,一年就是48天,平时节假日,别人3天假期,单休的两天
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务