Submission #842393

#TimeUsernameProblemLanguageResultExecution timeMemory
842393space_manKnapsack (NOI18_knapsack)Java
100 / 100
499 ms70212 KiB
import java.io.*;
import java.util.*;

import static java.lang.System.exit;

public class knapsack {
    static FastIO in;
    static PrintWriter out;
    static boolean multiTests = false;
    static boolean fileIO = false;

    void solve(int tNum) throws IOException {
        int s = in.nextInt(), n = in.nextInt();
        HashMap<Integer, ArrayList<Pair>> inventory = new HashMap<>();
        for (int i = 0; i < n; i++) {
            int v = in.nextInt(), w = in.nextInt(), c = in.nextInt();
            if(!inventory.containsKey(w)) inventory.put(w, new ArrayList<>());
            inventory.get(w).add(new Pair(v, c));
        }
        
        long[][] dp = new long[inventory.size() + 1][s + 1];
        for (long[] longs : dp) {
            Arrays.fill(longs, Integer.MIN_VALUE);
        }
        dp[0][0] = 0;
        int id = 1;
        for (Map.Entry<Integer, ArrayList<Pair>> entry : inventory.entrySet()) {
            int w = entry.getKey();
            ArrayList<Pair> list = entry.getValue();
            list.sort(Comparator.comparingInt(p -> -p.cost));
            for (int i = 0; i <= s; i++) {
                dp[id][i] = dp[id - 1][i];
                int taken = 0, index = 0, currTaken = 0;
                long total = 0L;
                while ((taken + 1) * w <= i && index < list.size()) {
                    taken++;
                    total += list.get(index).cost;
                    if(dp[id-1][i - w * taken] != Integer.MIN_VALUE) {
                        dp[id][i] = Math.max(dp[id][i], dp[id-1][i - w * taken] + total);
                    }
                    currTaken++;
                    if(currTaken == list.get(index).count) {
                        index++;
                        currTaken = 0;
                    }
                }
            }
            id++;
        }
        long ans = Integer.MIN_VALUE;
        for (int i = 0; i <= s; i++) {
            ans = Math.max(ans, dp[inventory.size()][i]);
        }
        out.println(ans);
    }
    
    static class Pair {
        int cost, count;

        public Pair(int cost, int count) {
            this.cost = cost;
            this.count = count;
        }
    }

    public static void main(String[] args) {
        try {
            in = fileIO ? new FastIO(".in") : new FastIO();
            out = fileIO ? new PrintWriter(new BufferedWriter(new FileWriter(".out"))) : new PrintWriter(System.out);
            knapsack closing = new knapsack();
            int T = multiTests ? in.nextInt() : 1;
            for (int t = 1; t <= T; t++) {
                closing.solve(t);
            }
            in.close();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
            exit(1);
        }
    }

    static class FastIO implements AutoCloseable {
        private DataInputStream din;
        private byte[] buffer;
        private int pointer, bytesRead;

        public FastIO() {
            this(new DataInputStream(System.in));
        }

        public FastIO(String filename) throws FileNotFoundException {
            this(new DataInputStream(new FileInputStream(filename)));
        }

        private FastIO(DataInputStream din) {
            this.din = din;
            buffer = new byte[1 << 17];
            pointer = bytesRead = 0;
        }

        public int nextInt() throws IOException {
            int r = 0;
            byte b;
            do {
                b = nextByte();
            } while (b <= ' ');

            boolean negative = false;
            if (b == '-') {
                negative = true;
                b = nextByte();
            }

            while (b >= '0' && b <= '9') {
                r = 10 * r + b - '0';
                b = nextByte();
            }

            return (negative) ? -r : r;
        }

        public long nextLong() throws IOException {
            long r = 0;
            byte b;
            do {
                b = nextByte();
            } while (b <= ' ');

            boolean negative = false;
            if (b == '-') {
                negative = true;
                b = nextByte();
            }

            while (b >= '0' && b <= '9') {
                r = 10 * r + b - '0';
                b = nextByte();
            }

            return (negative) ? -r : r;
        }

        public double nextDouble() throws IOException {
            double r = 0, d = 1;
            byte b;
            do {
                b = nextByte();
            } while (b <= ' ');

            boolean negative = false;
            if (b == '-') {
                negative = true;
                b = nextByte();
            }

            while (b >= '0' && b <= '9') {
                r = 10 * r + b - '0';
                b = nextByte();
            }

            if (b == '.') {
                b = nextByte();
                while (b >= '0' && b <= '9') {
                    r += (b - '0') / (d *= 10);
                    b = nextByte();
                }
            }

            return (negative) ? -r : r;
        }

        public String next() throws IOException {
            StringBuffer ret = new StringBuffer();
            byte b;

            do {
                b = nextByte();
            } while (b <= ' ');

            while (b > ' ') {
                ret.appendCodePoint(b);
                b = nextByte();
            }

            return ret.toString();
        }

        public byte nextByte() throws IOException {
            if (pointer == bytesRead) {
                bytesRead = din.read(buffer, 0, buffer.length);
                pointer = 0;
            }

            return buffer[pointer++];
        }

        @Override
        public void close() throws IOException {
            if (din == null) {
                return;
            }
            din.close();
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...