Submission #28077508


Source Code Expand

from bisect import *
from collections import defaultdict

n, W = map(int, input().split())
vl, wl = [], []
for _ in range(n):
    v, w = map(int, input().split())
    vl.append(v); wl.append(w)

def solve1():
    ### 半分全列挙
    vl1, vl2 = vl[:n//2], vl[n//2:]
    wl1, wl2 = wl[:n//2], wl[n//2:]
    
    d1 = defaultdict(int)
    for f in range(1 << len(vl1)):
        tmp_v = tmp_w = 0
        for i in range(len(vl1)):
            if (f >> i) & 1:
                tmp_v += vl1[i]
                tmp_w += wl1[i]
        d1[tmp_w] = max(d1[tmp_w], tmp_v)
    
    d2 = defaultdict(int)
    for f in range(1 << len(vl2)):
        tmp_v = tmp_w = 0
        for i in range(len(vl2)):
            if (f >> i) & 1:
                tmp_v += vl2[i]
                tmp_w += wl2[i]
        d2[tmp_w] = max(d2[tmp_w], tmp_v)
    
    keys = sorted(d2.keys())
    for i in range(len(keys) - 1):
        k1, k2 = keys[i], keys[i+1]
        if d2[k2] < d2[k1]: d2[k2] = d2[k1]
    
    res = 0
    for w1 in d1:
        if w1 > W: continue
        j = bisect_right(keys, W - w1)
        w2 = keys[j-1]
        res = max(res, d1[w1] + d2[w2])
    return res

def solve2():
    ### wを横軸にしたDP
    max_w = min(W, n * 1000)
    dp = [0] * (max_w + 1)
    
    for i in range(n):
        v, w = vl[i], wl[i]
        for j in range(max_w, w-1, -1):
            dp[j] = max(dp[j], dp[j-w] + v)
    return dp[min(W, max_w)]

def solve3():
    ### vを横軸にしたDP
    max_v = n * 1000
    dp = [0] + [float('inf')] * max_v
    
    for i in range(n):
        v, w = vl[i], wl[i]
        for j in range(max_v, v-1, -1):
            dp[j] = min(dp[j], dp[j-v] + w)
    
    res = 0
    for i in range(max_v + 1):
        if dp[i] <= W: res = i
    return res

if n <= 30:
    print(solve1())
elif max(wl) <= 1000:
    print(solve2())
else:
    print(solve3())



Submission Info

Submission Time
Task D - ナップサック問題
User salmon0852
Language PyPy3 (7.3.0)
Score 100
Code Size 1948 Byte
Status AC
Exec Time 686 ms
Memory 107312 KiB

Judge Result

Set Name Sample Subtask1 Subtask2 Subtask3
Score / Max Score 0 / 0 34 / 34 33 / 33 33 / 33
Status
AC × 4
AC × 19
AC × 17
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 68 ms 65700 KiB
subtask00_sample_2.txt AC 100 ms 79876 KiB
subtask00_sample_3.txt AC 61 ms 65600 KiB
subtask00_sample_4.txt AC 58 ms 65520 KiB
subtask01_0.txt AC 100 ms 79916 KiB
subtask01_1.txt AC 103 ms 80052 KiB
subtask01_10.txt AC 100 ms 79996 KiB
subtask01_11.txt AC 101 ms 80016 KiB
subtask01_12.txt AC 103 ms 80032 KiB
subtask01_13.txt AC 97 ms 80024 KiB
subtask01_14.txt AC 99 ms 80124 KiB
subtask01_2.txt AC 101 ms 80124 KiB
subtask01_3.txt AC 100 ms 79860 KiB
subtask01_4.txt AC 83 ms 73900 KiB
subtask01_5.txt AC 82 ms 74008 KiB
subtask01_6.txt AC 81 ms 74004 KiB
subtask01_7.txt AC 100 ms 79872 KiB
subtask01_8.txt AC 101 ms 80028 KiB
subtask01_9.txt AC 100 ms 80036 KiB
subtask02_0.txt AC 129 ms 71984 KiB
subtask02_1.txt AC 79 ms 70088 KiB
subtask02_10.txt AC 81 ms 70164 KiB
subtask02_11.txt AC 91 ms 70932 KiB
subtask02_12.txt AC 98 ms 70924 KiB
subtask02_13.txt AC 65 ms 69628 KiB
subtask02_14.txt AC 72 ms 69872 KiB
subtask02_2.txt AC 119 ms 71420 KiB
subtask02_3.txt AC 79 ms 70628 KiB
subtask02_4.txt AC 119 ms 71604 KiB
subtask02_5.txt AC 74 ms 70292 KiB
subtask02_6.txt AC 110 ms 71080 KiB
subtask02_7.txt AC 97 ms 71048 KiB
subtask02_8.txt AC 80 ms 70080 KiB
subtask02_9.txt AC 111 ms 70320 KiB
subtask03_0.txt AC 683 ms 107312 KiB
subtask03_1.txt AC 686 ms 103868 KiB
subtask03_10.txt AC 673 ms 102408 KiB
subtask03_11.txt AC 574 ms 82664 KiB
subtask03_2.txt AC 671 ms 102304 KiB
subtask03_3.txt AC 664 ms 102304 KiB
subtask03_4.txt AC 668 ms 102564 KiB
subtask03_5.txt AC 659 ms 101040 KiB
subtask03_6.txt AC 676 ms 104676 KiB
subtask03_7.txt AC 278 ms 78196 KiB
subtask03_8.txt AC 280 ms 78280 KiB
subtask03_9.txt AC 284 ms 77924 KiB