题解 | #购物单#

购物单

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

Java 构建物品类

类似0-1背包问题

我这里将附物品看作可以改变主物品价值和价格的一个物品,也就是一个主物品拥有多组价值和价格


public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        //价值 = 重要度 * 价格
        //int数组中为价值/价格
        List<int[][]> list = new ArrayList<>();
        //主物品的id list
        List<Integer> idList = new ArrayList<>();
        //所有物品的主键和Good
        Map<Integer,Good> goodMap = new LinkedHashMap<>();
        int N,m;
        N = in.nextInt();
        m = in.nextInt();
        for(int i = 0; i < m; i++){
            int v,p,q;//价格,重要度,主附件
            v = in.nextInt();
            p = in.nextInt();
            q = in.nextInt();
            if(q == 0){
                idList.add(i + 1);
            }
            Good good = new Good(i + 1,v,p,q);
            goodMap.put(i + 1,good);
        }
        goodMap.forEach((k,v) ->{
            int q = v.getQ();
            if(q != 0){
                int idF = v.getId();
                if(goodMap.get(q).getId1() == 0){
                    goodMap.get(q).setId1(idF);
                }else if(goodMap.get(q).getId2() == 0){
                    goodMap.get(q).setId2(idF);
                }
            }
        });
        /*
        for(int i = 0; i < m; i++){
            int v,p,q;//价格,重要度,主附件
            v = in.nextInt();
            p = in.nextInt();
            q = in.nextInt();
            if(q == 0){
                int[][] arr = new int[4][2];
                arr[0][0] = v * p;
                arr[0][1] = v;
                list.add(arr);
            }
            else{
                int[][] arr = list.get(q - 1);
                if(arr[1][0] == 0){
                    arr[1][0] = arr[0][0] + v * p;
                    arr[1][1] = arr[0][1] + v;
                }else{
                    arr[2][0] = arr[0][0] + v * p;
                    arr[2][1] = arr[0][1] + v;
                    arr[3][0] = arr[1][0] + v * p;
                    arr[3][1] = arr[1][1] + v;
                }
                list.remove(q - 1);
                list.add(q - 1,arr);
            }
        }*/
        int nums = idList.size();
        int[][] dp = new int[nums][N + 1];
        idList.forEach(v ->{
            int[][] arr = new int[4][2];
            Good good = goodMap.get(v);
            arr[0][0] = good.getV() * good.getP();
            arr[0][1] = good.getV();
            if(good.getId1() != 0){
                Good good1 = goodMap.get(good.getId1());
                arr[1][0] = arr[0][0] + good1.getV() * good1.getP();
                arr[1][1] = arr[0][1] + good1.getV();
            }
            if(good.getId2() != 0){
                Good good2 = goodMap.get(good.getId2());
                arr[2][0] = arr[0][0] + good2.getV() * good2.getP();
                arr[2][1] = arr[0][1] + good2.getV();
                arr[3][0] = arr[1][0] + good2.getV() * good2.getP();
                arr[3][1] = arr[1][1] + good2.getV();
            }
            list.add(arr);
        });
        for(int j = 0; j <= N; j++){
            int max = 0;
            int[][] arr = list.get(0);
            for(int k = 0; k < 4; k++){
                if((j - arr[k][1]) >= 0){
                    max = Math.max(max,arr[k][0]);
                }
            }
            dp[0][j] = max;
        }
        for(int i = 0; i < nums; i++){
            dp[i][0] = 0;
        }
        for(int i = 1; i < nums; i++){
            for(int j = 1; j <= N; j++){
                int max = dp[i-1][j];
                int[][] arr = list.get(i);
                for(int k = 0; k < 4; k++){
                    if((j - arr[k][1]) >= 0){
                        max = Math.max(max,dp[i-1][j - arr[k][1]] + arr[k][0]);
                    }
                }
                dp[i][j] = max;
            }
        }
        System.out.println(dp[nums-1][N]);
    }
}

class Good{
    /**
    * id
    */
    private int id;
    /**
    * 价格
    */
    private int v;
    /**
    * 重要度
    */
    private int p;
    /**
    * 所属主键编号
    */
    private int q;
    /**
    * 附件1 id
    */
    private int id1;
    /**
    * 附件2 id
    */
    private int id2;
    
    public Good(int id,int v,int p,int q){
        this.id = id;
        this.v = v;
        this.p = p;
        this.q = q;
    }
    public int getId(){
        return id;
    }
    public int getV(){
        return v;
    }
    public int getP(){
        return p;
    }
    public int getQ(){
        return q;
    }
    public void setId1(int id1){
        this.id1 = id1;
    }
    public int getId1(){
        return id1;
    }
    public void setId2(int id2){
        this.id2 = id2;
    }
    public int getId2(){
        return id2;
    }
}
全部评论

相关推荐

05-04 09:38
已编辑
门头沟学院 引擎开发
个人9本海硕,本硕期间一直在投游戏相关实习/校招,岗位由客户端-&gt;引擎-&gt;TA-&gt;AIGC。最终目标肯定是独游制作人,所以程序策划美术都点了些,感觉也没谁了。值此春招末尾总结下技术向校招要点,算是回馈牛客社区了。也附上我的Github和个人博客,欢迎各种交流讨论。&nbsp;前言&nbsp;首先是个人惯例的劝退游戏行业。参见缅怀故人&nbsp;和永远有多远&nbsp;,相比于互联网,游戏薪资大概相当但要求更高,加班严重且更为局限。如果你只是带着一腔热情想入这行,建议先找个日常实习了解下真实的游戏行业再做选择。&nbsp;准备&nbsp;当然,在你决定踏出这步后,第一步就是准备相关的笔试面试。这里先建议找到你感兴趣的公司岗位的JD,然后...
牛客28967172...:说的还是有道理的,我校招时就拿到过网易雷火好几个顶级项目组方向的offer,基本上流程和你说的一样。 但本质还是劝退互联网的游戏方向,本质上是代价更高,而且职业生涯容错率很低,方向比较窄。 代价是众所周知的严重加班,游戏大版本赶工基本上通宵无休,甚至国庆五一都没放假是常态。 职业生涯性价比低是因为游戏行业本质上就是赢家通吃,但你要跳槽只有腾讯网易等头部,要么就是米哈游莉莉丝库洛三七等少数中厂,然后就没了,公司是断崖的少 游戏开发相比互联网方向岗位非常非常少,比如网易整个雷火也才五六百人,里面十几个工作室,招人比例非常低,其他游戏公司也是一样。 而且方向也很窄,你做引擎开发就只能跳相关,你做游戏客户端也只能跳相关(游戏客户端都算吃香的,但市场hc也非常非常少,跳槽机会更少),基本上很难转回互联网 这里对比传统互联网,大厂多的都说不过来,而且容错率很大,你做搜索方向可以跳推荐,你做推荐方向可以跳广告,要求远没有游戏行业那么严,甚至你之前干测试都能跳槽研发方向
我的求职进度条
点赞 评论 收藏
分享
zzzilik:没事的,才刚刚开始,后面会捞的,这个三天没人发起面试自动结束,但是面试官还是能看到简历,四月份主战场会慢慢捞
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

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