题解 | 购物单

购物单

https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4?tpId=37&rp=1&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=&judgeStatus=&tags=593&title=&gioEnter=menu

此题解使用了BufferedReader + StreamTokenizer + PrintWriter提高了IO速度,通过封装函数将核心算法抽象出来。

import java.io.*;

public class Main {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out))) {
            StreamTokenizer in = new StreamTokenizer(br);
            while (in.nextToken() != StreamTokenizer.TT_EOF) {
                int m = (int) in.nval;
                in.nextToken();
                int n = (int) in.nval;
                Good[] allGoods = new Good[n];
                int primaryCount = 0;
                for (int i = 0; i < n; i++) {
                    allGoods[i] = readGood(in);
                    if (allGoods[i].q == 0) {
                        primaryCount++;
                    }
                }
                Good[] primaryGoods = new Good[primaryCount];
                int primaryIndex = 0;
                for (Good good : allGoods) {
                    if (good.q == 0) {
                        primaryGoods[primaryIndex++] = good;
                    } else {
                        allGoods[good.q - 1].appendix(good);
                    }
                }
                out.println(solution(primaryGoods, m));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static Good readGood(StreamTokenizer in) throws IOException {
        in.nextToken();
        int v = (int) in.nval;
        in.nextToken();
        int w = (int) in.nval;
        in.nextToken();
        int q = (int) in.nval;
        return new Good(v, w, q);
    }

    public static int solution(Good[] primary, int m) {
        int[][] dp = new int[m + 1][primary.length];
        for (int j = 0; j < primary.length; j++) {
            Good cur = primary[j];
            for (int i = 1; i <= m; i++) {
                int best = j > 0 ? dp[i][j - 1] : 0;
                int[] values = cur.getAllValue();
                int[] joys = cur.getAllJoy();
                for (int k = 0; k < cur.size; k++) {
                    if (i - values[k] >= 0) {
                        best = Math.max(best, joys[k] + (j > 0 ? dp[i - values[k]][j - 1] : 0));
                    }
                }
                dp[i][j] = best;
            }
        }
        return primary.length > 0 ? dp[m][primary.length - 1] : 0;
    }

    private static class Good {
        public int v;
        public int w;
        public int q;
        public int size = 1;
        public Good a1 = null;
        public Good a2 = null;

        public Good(int v, int w, int q) {
            this.v = v;
            this.w = w;
            this.q = q;
        }

        public void appendix(Good a) {
            if (a1 == null) {
                a1 = a;
                size++;
            } else {
                a2 = a;
                size += 2;
            }
        }

        public int[] getAllValue() {
            int[] result = new int[size];
            result[0] = v;
            if (a1 != null) {
                result[1] = v + a1.v;
            }
            if (a2 != null) {
                result[2] = v + a2.v;
                result[3] = v + a1.v + a2.v;
            }
            return result;
        }

        public int[] getAllJoy() {
            int[] result = new int[size];
            result[0] = v * w;
            if (a1 != null) {
                result[1] = v * w + a1.v * a1.w;
            }
            if (a2 != null) {
                result[2] = v * w + a2.v * a2.w;
                result[3] = v * w + a1.v * a1.w + a2.v * a2.w;
            }
            return result;
        }
    }
}

全部评论

相关推荐

下北澤大天使:你是我见过最美的牛客女孩😍
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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