動的計画法:0/1 ナップサック問題(1D & 2D DP)
問題
重さと価値のリスト、そして全体の容量が与えられたとき、ナップサックに入れられる価値の最大値を求めます。
2D DP
def knapsack_2d(weights, values, W):
n = len(weights)
dp = [[0] * (W + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
for w in range(W + 1):
if weights[i - 1] <= w:
dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1])
else:
dp[i][w] = dp[i - 1][w]
return dp[n][W]
1D DP(空間最適化)
def knapsack_1d(weights, values, W):
n = len(weights)
dp = [0] * (W + 1)
for i in range(n):
for w in range(W, weights[i] - 1, -1):
dp[w] = max(dp[w], dp[w - weights[i]] + values[i])
return dp[W]