ここでは、 「同じ品物を何度も選ぶことができる」という制約条件のもとでのナップサック問題について、 DP(動的計画法)を使用し python3 で実装する方法を紹介します。
また 「プログラミングコンテストチャレンジブック(第2版)」(通称:蟻本)の p58 を例にしています。
時間計算量は、O(nW)です。
# 入力
n = 3
w = [3, 4, 2]
v = [4, 5, 3]
W = 7
#DPテーブル(0 で初期化)
dp = [ [0 for i in range(W+1)] for j in range(n+1)]
def solve():
for i in range(n):
for j in range(W+1):
#品物は入らない
if j < w[i]:
dp[i+1][j] = dp[i][j]
#入れない場合と入れる場合の大きい方をとる
else:
dp[i+1][j] = max(dp[i][j], dp[i+1][j - w[i]] + v[i])
print(dp[n][W])
if __name__ == '__main__':
solve()