ここでは、ナップサック問題について、 「プログラミングコンテストチャレンジブック(第2版)」(通称:蟻本)の p55 を例に、python3 で実装する方法を紹介します。
DP(動的計画法)を使用し、配列を昇順で更新していく方法で記述します。
また、時間計算量は、O(nW)です。
# 入力
n = 4
w = [2, 1, 3, 2]
v = [3, 2, 4, 2]
W = 5
#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][j - w[i]] + v[i])
print(dp[n][W])
if __name__ == '__main__':
solve()