rambless

购物单

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

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int N = in.nextInt();
            int m = in.nextInt();

            Goods[] arr = new Goods[m + 1];
            for (int i = 1; i <= m; i++) {
                int v = in.nextInt();
                int p = in.nextInt();
                int q = in.nextInt();
                arr[i] = new Goods(v, p, q);
            }
            for (int i = 1; i < arr.length; i++) {
                if (arr[i].q > 0) {
                    if (arr[arr[i].q].a == 0) {
                        arr[arr[i].q].a = i;
                    } else {
                        arr[arr[i].q].b = i;
                    }
                }
            }

            //构造dp二维数组dp[i][j],存放j钱数下,买前i种物品的最大满意度
            int[][] dp = new int[m + 1][N + 1];
            for (int i = 1; i <= m; i++) {
                int v0 = 0, z0 = 0;
                int v1 = 0, z1 = 0;
                int v2 = 0, z2 = 0;
                int v3 = 0, z3 = 0;
                if (arr[i].a == 0 && arr[i].b == 0) {
                    v0 = arr[i].v;
                    z0 = arr[i].v * arr[i].p;
                }
                if (arr[i].a != 0 && arr[i].b == 0) {
                    v0 = arr[i].v;
                    z0 = arr[i].v * arr[i].p;
                    v1 = arr[i].v + arr[arr[i].a].v;
                    z1 = arr[i].v * arr[i].p + arr[arr[i].a].v * arr[arr[i].a].p;
                }
                if (arr[i].a == 0 && arr[i].b != 0) {
                    v0 = arr[i].v;
                    z0 = arr[i].v * arr[i].p;
                    v2 = arr[i].v + arr[arr[i].b].v;
                    z2 = arr[i].v * arr[i].p + arr[arr[i].b].v * arr[arr[i].b].p;
                }
                if (arr[i].a != 0 && arr[i].b != 0) {
                    v0 = arr[i].v;
                    z0 = arr[i].v * arr[i].p;
                    v1 = arr[i].v + arr[arr[i].a].v;
                    z1 = arr[i].v * arr[i].p + arr[arr[i].a].v * arr[arr[i].a].p;
                    v2 = arr[i].v + arr[arr[i].b].v;
                    z2 = arr[i].v * arr[i].p + arr[arr[i].b].v * arr[arr[i].b].p;
                    v3 = arr[i].v + arr[arr[i].a].v + arr[arr[i].b].v;
                    z3 = arr[i].v * arr[i].p + arr[arr[i].a].v * arr[arr[i].a].p + arr[arr[i].b].v *
                         arr[arr[i].b].p;
                }
                for (int j = 0; j <= N; j++) {
                    //附件时跳过及非附件时赋初始值
                    dp[i][j] = dp[i - 1][j];
                    if (arr[i].q == 0) {
                        if (j >= v0 && v0 > 0) {
                            dp[i][j] = Math.max(dp[i - 1][j - v0] + z0, dp[i][j]);
                        }
                        if (j >= v1 && v1 > 0) {
                            dp[i][j] = Math.max(dp[i - 1][j - v1] + z1, dp[i][j]);
                        }
                        if (j >= v2 && v2 > 0) {
                            dp[i][j] = Math.max(dp[i - 1][j - v2] + z2, dp[i][j]);
                        }
                        if (j >= v3 && v3 > 0) {
                            dp[i][j] = Math.max(dp[i - 1][j - v3] + z3, dp[i][j]);
                        }
                    }
                }
            }
            System.out.println(dp[m][N]);
        }
    }



    static class Goods {
        public Goods(int v, int p, int q) {
            this.v = v;
            this.p = p;
            this.q = q;
        }
        private int v;
        private int p;
        private int q;

        private int a = 0;//附件1的ID
        private int b = 0;//附件2的ID
    }
}

全部评论

相关推荐

码农索隆:充分发挥学生的价值。 校长银行卡扣款100w,都以为是自动付款没关
你找实习最大的坎坷是什么
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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