Submission #7082970


Source Code Expand

import bisect

INF = 10**15
n, W = map(int, input().split())
w = []
v = []
max_w = 0
max_v = 0
for i in range(n):
    v_, w_ = map(int, input().split())
    if max_v < v_:
        max_v = v_
    if max_w < w_:
        max_w = w_
    w.append(w_)
    v.append(v_)

# N <= 30
def solve1():
    global n, W, items
    # 半分全列挙
    a = n // 2
    b = n - a

    items1 = []
    items2 = []
    for i in range(2 ** a):
        w_ = 0
        v_ = 0
        for j in range(a):
            if i & 2**j > 0:
                w_ += w[j]
                v_ += v[j]
        items1.append([w_, v_])
    items1 = sorted(items1, key=lambda x: (x[0], -x[1]))
    for i in range(2 ** b):
        w_ = 0
        v_ = 0
        for j in range(b):
            if i & 2**j > 0:
                w_ += w[a+j]
                v_ += v[a+j]
        items2.append([w_, v_])
    items2 = sorted(items2, key=lambda x: (x[0], -x[1]))

    a_items = []
    pre_v = 0
    for i in range(len(items1)):
        if items1[i][0] > W:
            break
        if items1[i][1] > pre_v:
            a_items.append(items1[i])
            pre_v = items1[i][1]
    a_items.insert(0, [0, 0])

    b_items = []
    pre_v = 0
    for i in range(len(items2)):
        if items2[i][0] > W:
            break
        if items2[i][1] > pre_v:
            b_items.append(items2[i])
            pre_v = items2[i][1]
    b_items.insert(0, [0, 0])
    b_items.append([10**20, 0])
    b_w = [x[0] for x in b_items]

    ans = 0
    for i in range(len(a_items)):
        w_ = W - a_items[i][0]
        idx = bisect.bisect_left(b_w, w_) - 1
        if a_items[i][0] + b_items[idx][0] <= W:
            ans = max(ans, a_items[i][1] + b_items[idx][1])
        idx = bisect.bisect_left(b_w, w_)
        if a_items[i][0] + b_items[idx][0] <= W:
            ans = max(ans, a_items[i][1] + b_items[idx][1])
    print(ans)


# max_w <= 1000
def solve2():
    global n, W, items
    # wのdp
    dp = [[0 for _ in range(W+1)]for _ in range(n+1)]

    for i in range(n):
        for j in range(w[i]):
            dp[i+1][j] = dp[i][j]
        for j in range(w[i], W+1):
            dp[i+1][j] = max(dp[i][j], dp[i+1][j-1], dp[i][j - w[i]] + v[i])
    ans = 0
    for i in range(W+1):
        ans = max(ans, dp[n][i])
    print(ans)


# max_v <= 1000
def solve3():
    global n, W, items
    # vのdp
    sum_v = 0
    for i in range(n):
        sum_v += v[i]
    dp = [[INF for _ in range(sum_v+1)]for _ in range(n+1)]

    for i in range(n+1):
        dp[i][0] = 0
    for i in range(n):
        for j in range(v[i]):
            dp[i+1][j] = dp[i][j]
        for j in range(v[i], sum_v+1):
            dp[i+1][j] = min(dp[i][j], dp[i][j - v[i]] + w[i])
    ans = 0
    for i in range(len(dp[n])):
        if dp[n][i] <= W:
            ans = i
    print(ans)

if n <= 30:
    solve1()
elif max_w <= 1000:
    solve2()
else:
    solve3()

Submission Info

Submission Time
Task D - ナップサック問題
User bluexleoxgreen
Language PyPy3 (2.4.0)
Score 100
Code Size 3007 Byte
Status AC
Exec Time 898 ms
Memory 288828 KB

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 180 ms 38256 KB
subtask00_sample_2.txt AC 427 ms 50544 KB
subtask00_sample_3.txt AC 178 ms 38256 KB
subtask00_sample_4.txt AC 176 ms 38256 KB
subtask01_0.txt AC 426 ms 50288 KB
subtask01_1.txt AC 426 ms 50288 KB
subtask01_10.txt AC 430 ms 50288 KB
subtask01_11.txt AC 426 ms 50416 KB
subtask01_12.txt AC 425 ms 50288 KB
subtask01_13.txt AC 439 ms 50416 KB
subtask01_14.txt AC 422 ms 50288 KB
subtask01_2.txt AC 427 ms 50288 KB
subtask01_3.txt AC 425 ms 50288 KB
subtask01_4.txt AC 308 ms 50160 KB
subtask01_5.txt AC 317 ms 50544 KB
subtask01_6.txt AC 311 ms 50160 KB
subtask01_7.txt AC 424 ms 50288 KB
subtask01_8.txt AC 420 ms 50288 KB
subtask01_9.txt AC 421 ms 50288 KB
subtask02_0.txt AC 870 ms 257800 KB
subtask02_1.txt AC 316 ms 69724 KB
subtask02_10.txt AC 311 ms 69724 KB
subtask02_11.txt AC 404 ms 105180 KB
subtask02_12.txt AC 479 ms 121308 KB
subtask02_13.txt AC 199 ms 39536 KB
subtask02_14.txt AC 248 ms 52188 KB
subtask02_2.txt AC 729 ms 209720 KB
subtask02_3.txt AC 303 ms 66652 KB
subtask02_4.txt AC 732 ms 209720 KB
subtask02_5.txt AC 248 ms 50908 KB
subtask02_6.txt AC 613 ms 172232 KB
subtask02_7.txt AC 485 ms 121308 KB
subtask02_8.txt AC 311 ms 69724 KB
subtask02_9.txt AC 627 ms 172488 KB
subtask03_0.txt AC 898 ms 288828 KB
subtask03_1.txt AC 828 ms 257160 KB
subtask03_10.txt AC 828 ms 257032 KB
subtask03_11.txt AC 192 ms 39152 KB
subtask03_2.txt AC 817 ms 257160 KB
subtask03_3.txt AC 822 ms 257160 KB
subtask03_4.txt AC 823 ms 257032 KB
subtask03_5.txt AC 821 ms 257160 KB
subtask03_6.txt AC 831 ms 257032 KB
subtask03_7.txt AC 818 ms 257672 KB
subtask03_8.txt AC 812 ms 257672 KB
subtask03_9.txt AC 826 ms 257672 KB