题解 | #购物单#

购物单

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

整合了题解里最高赞的两位大佬的题解,动态规划(空间压缩)的代码运行报错,经过排查出现两个问题:

1.new GOODS();爆红,输出静态方法不能引用非静态变量的异常;

2. if (goods[q-1].a1 == -1) { 最后一个示例报空指针异常——原因是没有全部初始化。比如第一个物品是第五个的附件,那么找不到第五个的a1的值。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    private static class good {
        public int v;  //物品的价格
        public int p;  //物品的重要度
        public int q;  //物品的主附件ID

        public int a1 = -1; //附件1ID
        public int a2 = -1; //附件2ID

        public good(int v, int p, int q) {
            this.v = v;
            this.p = p;
            this.q = q;
        }

        public void setA1(int a1) {
            this.a1 = a1;
        }

        public void setA2(int a2) {
            this.a2 = a2;
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt(); //记录总共要买的物品数量
        int m = in.nextInt();

        good[] goods = new good[m];

        for (int i = 0; i < m; i++) {
            int v1 = in.nextInt();
            int p1 = in.nextInt();
            int q1 = in.nextInt();

            goods[i] = new good(v1, p1 * v1, q1); //直接计算好价值
        }

        for (int i = 0; i < m; i++) {

            if (goods[i].q > 0) {
                if (goods[goods[i].q-1].a1 == -1) {
                    goods[goods[i].q-1].a1 = i;
                } else {
                    goods[goods[i].q-1].a2 = i;
                }
            }
        }


        //转为01背包问题 倒序
        int[] dp = new int[N + 1];
        for (int i = 1; i <= m;
                i++) { //i指的是物品的次序,和goods[]的下标不一致
            for (int j = N; j >= 0; j--) {
                if (goods[i - 1].q > 0) {
                    continue;//这是附件,跳过
                }
                if (j >= goods[i - 1].v) {
                    //情况一:选/不选该物品
                    dp[j] = Math.max(dp[j], dp[j - goods[i - 1].v] + goods[i - 1].p);
                }
                if (goods[i - 1].a1 != -1 && j >= goods[i - 1].v + goods[goods[i - 1].a1].v) {
                    //情况二:选不选该物品的附件一
                    dp[j] = Math.max(dp[j], dp[j - goods[i - 1].v - goods[goods[i - 1].a1].v] +
                                     goods[i - 1].p + goods[goods[i - 1].a1].p);
                }
                if (goods[i - 1].a2 != -1 && j >= goods[i - 1].v + goods[goods[i - 1].a2].v) {
                    //情况三:选不选该物品的附件二
                    dp[j] = Math.max(dp[j], dp[j - goods[i - 1].v - goods[goods[i - 1].a2].v] +
                                     goods[i - 1].p + goods[goods[i - 1].a2].p);
                }
                if (goods[i - 1].a1 != -1 && goods[i - 1].a2 != -1 &&
                        j >= goods[i - 1].v + goods[goods[i - 1].a1].v + goods[goods[i - 1].a2].v) {
                    //情况四:选不选该物品的两个附件
                    dp[j] = Math.max(dp[j], dp[j - goods[i - 1].v - goods[goods[i - 1].a1].v -
                                               goods[goods[i - 1].a2].v] + goods[i - 1].p + goods[goods[i - 1].a1].p +
                                     goods[goods[i - 1].a2].p);

                }

            }
        }
        System.out.println(dp[N]);
    }

}

全部评论

相关推荐

最近又搬回宿舍了,在工位坐不住,写一写秋招起伏不断的心态变化,也算对自己心态的一些思考表演式学习从开始为实习准备的时候就特别焦虑,楼主一开始选择的是cpp后端,但是24届这个方向已经炸了,同时自己又因为本科非92且非科班,所以感到机会更加迷茫。在某天晚上用java写出hello&nbsp;world并失眠一整晚后选择老本行干嵌入式。理想是美好的,现实情况是每天忙但又没有实质性进展,总是在配环境,调工具,顺带还要推科研。而这时候才发现自己一直在表演式学习,徘徊在设想如何展开工作的循环里,导致没有实质性进展。现在看来当时如果把精力专注在动手写而不是两只手端着看教程,基本功或许不会那么差。实习的焦虑5月,楼主...
耶比:哲学上有一个问题,玛丽的房间:玛丽知道眼睛识别色彩的原理知道各种颜色,但是她生活在黑白的房间里,直到有一天玛丽的房门打开了她亲眼看到了颜色,才知道什么是色彩。我现在最大可能的减少对非工作事情的思考,如果有一件事困扰了我, 能解决的我就直接做(去哪里或者和谁吵架等等……),解决不了的我就不想了,每一天都是最年轻的一天,珍惜今天吧
投递比亚迪等公司10个岗位 > 秋招被确诊为…… 牛客创作赏金赛
点赞 评论 收藏
分享
11-27 12:36
已编辑
门头沟学院 前端工程师
Apries:这个阶段来说,很厉害很厉害了,不过写的简历确实不是很行,优势删掉吧,其他的还行
点赞 评论 收藏
分享
Noob1024:一笔传三代,人走笔还在
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务