Submission #5553897


Source Code Expand

import java.util.*;

public class Main {
    private static final long INF = 200 * 1000000000L + 1;

    int n, lw;
    long v[], w[];

    public void main(Scanner sc) {
        n = sc.nextInt();
        lw = sc.nextInt();
        v = new long[n];
        w = new long[n];

        for (int i = 0; i < n; i++) {
            v[i] = sc.nextInt();
            w[i] = sc.nextInt();
        }

        long maxValue = Arrays.stream(v).max().getAsLong();
        long maxWeight = Arrays.stream(w).max().getAsLong();
        if (maxValue <= 1000) {
            System.out.println(knap1((int) maxValue));
        } else if (maxWeight <= 1000) {
            System.out.println(knap2());
        } else {
            System.out.println(knap3());
        }
    }

    private long knap1(int mv) {
        long dp[] = new long[n * mv + 1];
        Arrays.fill(dp, INF);

        dp[0] = 0;
        for (int i = 0; i < n; i++) {
            int vi = (int) v[i];
            for (int j = n * mv; j >= vi; j--) {
                dp[j] = Math.min(dp[j], dp[j - vi] + w[i]);
            }
        }

        long ans = 0;
        for (int i = 0; i <= n * mv; i++) {
            if (dp[i] <= lw) {
                ans = i;
            }
        }

        return ans;
    }

    private long knap2() {
        long dp[][] = new long[n + 1][lw + 1];

        for (int i = 1; i <= n; i++) {
            int wi = (int) w[i - 1];
            for (int j = wi; j <= lw; j++) {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - wi] + v[i - 1]);
            }
        }

        return dp[n][lw];
    }

    private long knap3() {
        int n1 = n / 2;
        int n2 = n - n1;

        Map<Long, Long> wv1 = new TreeMap<>((v1, v2) -> Long.compare(v1, v2));
        Map<Long, Long> wv2 = new TreeMap<>((v1, v2) -> Long.compare(v1, v2));

        for (int i = 0; i < (1 << n1); i++) {
            long sumW = 0, sumV = 0;
            for (int j = 0; j < n1; j++) {
                if ((i >> j) % 2 == 1) {
                    sumW += w[j];
                    sumV += v[j];
                }
            }
            wv1.put(sumV, Math.max(wv1.getOrDefault(sumV, 0L), sumW));
        }

        for (int i = 0; i < (1 << n2); i++) {
            long sumW = 0, sumV = 0;
            for (int j = 0; j < n2; j++) {
                if ((i >> j) % 2 == 1) {
                    sumW += w[j + n1];
                    sumV += v[j + n1];
                }
            }
            wv2.put(sumV, Math.max(wv2.getOrDefault(sumV, 0L), sumW));
        }

        long ans = 0;
        for (Map.Entry<Long, Long> entry1 : wv1.entrySet()) {
            long nw1 = entry1.getValue();
            long nv1 = entry1.getKey();
            if (nw1 > lw) {
                continue;
            }

            for (Map.Entry<Long, Long> entry2 : wv2.entrySet()) {
                long nw2 = entry2.getValue();
                if (nw1 + nw2 > lw) {
                    continue;
                }

                ans = Math.max(ans, nv1 + entry2.getKey());
            }
        }

        return ans;
    }

    public static void main(String[] args) throws Exception {
        try (Scanner sc = new Scanner(System.in)) {
            new Main().main(sc);
        } catch (Exception e) {
            throw e;
        }
    }
}

Submission Info

Submission Time
Task D - ナップサック問題
User minorin
Language Java8 (OpenJDK 1.8.0)
Score 67
Code Size 3424 Byte
Status WA
Exec Time 469 ms
Memory 247376 KB

Judge Result

Set Name Sample Subtask1 Subtask2 Subtask3
Score / Max Score 0 / 0 34 / 34 0 / 33 33 / 33
Status
AC × 4
AC × 19
AC × 7
WA × 10
AC × 14
Set Name Test Cases
Sample subtask00_sample_1.txt, subtask00_sample_2.txt, subtask00_sample_3.txt, subtask00_sample_4.txt
Subtask1 subtask01_0.txt, subtask01_1.txt, subtask01_10.txt, subtask01_11.txt, subtask01_12.txt, subtask01_13.txt, subtask01_14.txt, subtask01_2.txt, subtask01_3.txt, subtask01_4.txt, subtask01_5.txt, subtask01_6.txt, subtask01_7.txt, subtask01_8.txt, subtask01_9.txt, subtask00_sample_1.txt, subtask00_sample_2.txt, subtask00_sample_3.txt, subtask00_sample_4.txt
Subtask2 subtask02_0.txt, subtask02_1.txt, subtask02_10.txt, subtask02_11.txt, subtask02_12.txt, subtask02_13.txt, subtask02_14.txt, subtask02_2.txt, subtask02_3.txt, subtask02_4.txt, subtask02_5.txt, subtask02_6.txt, subtask02_7.txt, subtask02_8.txt, subtask02_9.txt, subtask00_sample_1.txt, subtask00_sample_3.txt
Subtask3 subtask03_0.txt, subtask03_1.txt, subtask03_10.txt, subtask03_11.txt, subtask03_2.txt, subtask03_3.txt, subtask03_4.txt, subtask03_5.txt, subtask03_6.txt, subtask03_7.txt, subtask03_8.txt, subtask03_9.txt, subtask00_sample_1.txt, subtask00_sample_4.txt
Case Name Status Exec Time Memory
subtask00_sample_1.txt AC 238 ms 27728 KB
subtask00_sample_2.txt AC 373 ms 31436 KB
subtask00_sample_3.txt AC 189 ms 26452 KB
subtask00_sample_4.txt AC 179 ms 24392 KB
subtask01_0.txt AC 382 ms 34076 KB
subtask01_1.txt AC 426 ms 31816 KB
subtask01_10.txt AC 374 ms 31264 KB
subtask01_11.txt AC 376 ms 32216 KB
subtask01_12.txt AC 469 ms 33672 KB
subtask01_13.txt AC 356 ms 31140 KB
subtask01_14.txt AC 425 ms 31600 KB
subtask01_2.txt AC 364 ms 31276 KB
subtask01_3.txt AC 370 ms 31720 KB
subtask01_4.txt AC 241 ms 31480 KB
subtask01_5.txt AC 181 ms 26452 KB
subtask01_6.txt AC 180 ms 26836 KB
subtask01_7.txt AC 335 ms 31764 KB
subtask01_8.txt AC 462 ms 33124 KB
subtask01_9.txt AC 354 ms 32316 KB
subtask02_0.txt WA 368 ms 247376 KB
subtask02_1.txt WA 236 ms 54100 KB
subtask02_10.txt WA 217 ms 52948 KB
subtask02_11.txt AC 252 ms 81236 KB
subtask02_12.txt AC 286 ms 123340 KB
subtask02_13.txt AC 216 ms 24916 KB
subtask02_14.txt WA 206 ms 35028 KB
subtask02_2.txt WA 323 ms 164308 KB
subtask02_3.txt WA 228 ms 57300 KB
subtask02_4.txt WA 332 ms 162132 KB
subtask02_5.txt WA 209 ms 32460 KB
subtask02_6.txt WA 321 ms 161876 KB
subtask02_7.txt AC 286 ms 127568 KB
subtask02_8.txt WA 230 ms 53460 KB
subtask02_9.txt AC 309 ms 165844 KB
subtask03_0.txt AC 309 ms 27092 KB
subtask03_1.txt AC 307 ms 25792 KB
subtask03_10.txt AC 306 ms 26320 KB
subtask03_11.txt AC 194 ms 24404 KB
subtask03_2.txt AC 309 ms 28628 KB
subtask03_3.txt AC 309 ms 29012 KB
subtask03_4.txt AC 306 ms 26708 KB
subtask03_5.txt AC 306 ms 27092 KB
subtask03_6.txt AC 313 ms 27476 KB
subtask03_7.txt AC 310 ms 26708 KB
subtask03_8.txt AC 313 ms 26836 KB
subtask03_9.txt AC 306 ms 28880 KB