import random

def max_value_recursive(weights, values, max_weight, i):
if len(weights) == i:
return 0
if max_weight - weights[i] <= 0:
return 0
value_not_pick = max_value_recursive(weights, values, max_weight, i + 1)
value_pick = max_value_recursive(weights, values, max_weight - weights[i], i + 1)
return max(value_not_pick, values[i] + value_pick)

def max_value(weights, values, max_weight):
return max_value_recursive(weights, values, max_weight, 0)

def max_value_dp(weights, values, max_weight):
dp = [[0 for i in range(max_weight)] for i in range(len(weights))]
i = len(weights) - 1
for j in range(weights[i], max_weight):
dp[i][j] = values[i]
for i in range(len(weights) - 2, -1, -1):
for j in range(weights[i], max_weight):
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j - weights[i]] + values[i])
return dp[0][max_weight - 1]

N = 25
W = 50
weights = [random.randint(0, 9) for i in range(N)]
values = [random.randint(0, 9) for i in range(N)]
print(weights)
print(values)
print(max_value(weights, values, W))
print(max_value_dp(weights, values, W))

[3, 0, 2, 6, 5, 5, 8, 1, 5, 4, 8, 8, 5, 5, 7, 4, 8, 8, 1, 3, 0, 3, 3, 6, 8]
[3, 5, 5, 0, 6, 5, 9, 4, 2, 9, 6, 1, 1, 7, 9, 5, 4, 7, 9, 9, 4, 1, 2, 0, 2]
88
88