いがくせいのひとりごと

医学生の独り言を記録していきます。詳細は「#1自己紹介とブログの紹介」の記事を参照していただけると幸いです。

DPL_1_C - ナップザック問題

動的計画法について、基本的な問題(ナップザック問題)をPythonで解いてみました!

前回の記事とほとんど同じコードで解くことができます。 dp[i+1][w]の求め方が少し違います。

dp[n][w]は「n番目までの商品を、重さwを超えないで選んだ時の最大値」です。

DPL_1_C - ナップザック問題

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DPL_1_C&lang=ja

~
#入力データの処理
N,W = map(int,input().split())
vwl = []
for _ in range(N):
    v,w = map(int,input().split())
    vwl.append((v,w))

#動的計画法の準備
dp = [[0]*(W+1) for _ in range(N+1)]

#動的計画法の実行
for i in range(N):
    vi,wi = vwl[i]
    for w in range(W+1):
        if w-wi>=0:#dp[i][w-wi]が二次元配列の外に行かないか判定
            #次行変更箇所
            dp[i+1][w] = max(dp[i+1][w-wi]+vi,dp[i][w])#重さwiのものを取るべきか判定
        else:
            dp[i+1][w] = dp[i][w]
print(dp[N][W])
~