Pythonで理解する蟻本「2-3 01 ナップサック問題その2」(p.60)
この記事は「プログラミングコンテストチャレンジブック第2版」(蟻本)の
「2-3 01 ナップサック問題その2」(p.60)
のコードをPythonで書き直したものとなっています。
入力
入力例
4 5
2 1 3 2
3 2 4 2
解答
# 入力
n, W = map(int,input().split())
w = list(map(int,input().split()))
v = list(map(int,input().split()))
MAX_N = 100
MAX_V = 100
INF = float('inf')
dp = [[INF] * (MAX_N * MAX_V + 1) for _ in range(MAX_N + 1)] # DPテーブル
dp[0][0] = 0
for i in range(n):
for j in range(MAX_N * MAX_V + 1):
if j < v[i]:
dp[i + 1][j] = dp[i][j]
else:
dp[i + 1][j] = min(dp[i][j], dp[i][j - v[i]] + w[i])
res = 0
for i in range(MAX_N * MAX_V + 1):
if dp[n][i] <= W:
res = i
print(res)