Buggy python submission (verdict: Time Limit Exceeded):
# dp[w] i番目までの品物で、重さがw以下になるよう選んだときの価値の最大値。
# 品物を増やすごとに、配列を更新して使いまわす。
# 重さは1~W 添え字は0<=w<=W<W+1 dpリストの長さはW+1
# ループは1~N回回す　添え字は0<=i<=N-1<N
# 添え字i, i+1回目のループでのdp[j]の求め方 i+1番目の品物を選ぶかどうか？
# j-w(i)<0のとき、重量オーバーで選べない。dp[j]は変わらない
# j-w(i)>=0のとき、dp[j]=max(dp[j], dp[j-w(i)]+v(i))
# 配列は逆側から更新していく
# 解答はN回ループした後のdp[W+1]=dp[-1] 最後の値

# 入力
# 重さと価値はループのなかで都度取得する
N, W = map(int, input().strip().split())

# 初期化
dp = [0] * (W + 1)

# dpテーブル
for i in range(N):
    w, c = map(int, input().strip().split())
    for j in range(W, -1, -1):
        if j - w >= 0:
            dp[j] = max(dp[j], dp[j - w] + c)

print(dp[-1])

Fixed submission:
# dp[w] i番目までの品物で、重さがw以下になるよう選んだときの価値の最大値。
# 参考 https://qiita.com/drken/items/68b8503ad4ffb469624c

import numpy as np

# 入力
# 重さと価値はループのなかで都度取得する
N, W = map(int, input().strip().split())

# 初期化
dp = np.zeros(W + 1, dtype='int64')

# dpテーブル
for i in range(N):
    w, v = map(int, input().strip().split())
    dp[w:] = np.maximum(dp[w:], dp[:-w] + v)

print(dp[-1])

Buggy python submission (verdict: Time Limit Exceeded):
# dp[w] i番目までの品物で、重さがw以下になるよう選んだときの価値の最大値。
# 品物を増やすごとに、配列を更新して使いまわす。
# 重さは1~W 添え字は0<=w<=W<W+1 dpリストの長さはW+1
# ループは1~N回回す　添え字は0<=i<=N-1<N
# 添え字i, i+1回目のループでのdp[j]の求め方 i+1番目の品物を選ぶかどうか？
# j-w(i)<0のとき、重量オーバーで選べない。dp[j]は変わらない
# j-w(i)>=0のとき、dp[j]=max(dp[j], dp[j-w(i)]+v(i))
# 配列は逆側から更新していく
# 解答はN回ループした後のdp[W+1]=dp[-1] 最後の値

# 入力
# tableは二次元配列　table[i][0]でi番目の品物の重さ、table[i][1]で価値
N, W = list(map(int, input().strip().split()))
table = []
for i in range(N):
    table.append(list(map(int, input().strip().split())))

# 初期化
dp = [0] * (W + 1)

# dpテーブル
for i in range(N):
    for j in range(W, -1, -1):
        if j - table[i][0] >= 0:
            dp[j] = max(dp[j], dp[j - table[i][0]] + table[i][1])

print(dp[-1])

Fixed submission:
# dp[w] i番目までの品物で、重さがw以下になるよう選んだときの価値の最大値。
# 参考 https://qiita.com/drken/items/68b8503ad4ffb469624c

import numpy as np

# 入力
# 重さと価値はループのなかで都度取得する
N, W = map(int, input().strip().split())

# 初期化
dp = np.zeros(W + 1, dtype='int64')

# dpテーブル
for i in range(N):
    w, v = map(int, input().strip().split())
    dp[w:] = np.maximum(dp[w:], dp[:-w] + v)

print(dp[-1])

Buggy python submission (verdict: Time Limit Exceeded):
# dp[i][j] i番目までの品物で、重さがj以下になるよう選んだときの価値の最大値
# 0<=i<N+1, 0<=j<W+1  i=0, j=0のときはdpはすべて0
# 初期値 dp[1] j<w1ならdp[1][j]=0, j>=w1ならdp[1][j]=v1
# dp[i+1][j]の求め方 i+1番目の品物を選ぶかどうか
# j-w(i+1)<0のとき、dp[i+1][j] = dp[i][j]
# j-w(i+1)>=0のとき、dp[i+1][j]=max(dp[i][j], dp[i][j-w(i+1)]+v(i+1))
# 解答はdp[N][W]

# 入力
# tableは二次元配列　table[i][0]でi番目の品物の重さ、table[i][1]で価値 i=0は添え字をdpとそろえるためにつけた
N, W = list(map(int, input().strip().split()))
table = [[0, 0]]
for i in range(1, N+1):
    table.append(list(map(int, input().strip().split())))


# 初期化 dpテーブルの行数はN+1, 列数はW+1
dp = [[0] * (W + 1) for i in range(N + 2)]

# 初期値 i=1
for j in range(W + 1):
    if j < table[1][0]:
        dp[1][j] = 0
    else:
        dp[1][j] = table[1][1]

# dpテーブル
for i in range(1, N):
    for j in range(W + 1):
        if j - table[i+1][0] < 0:
            dp[i + 1][j] = dp[i][j]
        else:
            dp[i + 1][j] = max(dp[i][j], dp[i][j - table[i + 1][0]] + table[i + 1][1])

print(dp[N][W])

Fixed submission:
# dp[w] i番目までの品物で、重さがw以下になるよう選んだときの価値の最大値。
# 参考 https://qiita.com/drken/items/68b8503ad4ffb469624c

import numpy as np

# 入力
# 重さと価値はループのなかで都度取得する
N, W = map(int, input().strip().split())

# 初期化
dp = np.zeros(W + 1, dtype='int64')

# dpテーブル
for i in range(N):
    w, v = map(int, input().strip().split())
    dp[w:] = np.maximum(dp[w:], dp[:-w] + v)

print(dp[-1])