公式

C - ナップサックと宝物 / Knapsack and Treasures 解説 by sounansya


典型的なナップザック問題です。

\(d[i][s]\) を「\(i\) 番目の荷物まで考えた時に、重さの合計が \(s\) 以下で得られる価値の合計の最大値」とした動的計画法で \(O(NW)\) 時間で答えを求めることができます。

実装例(Python3)

N, W = map(int, input().split())
d = [0] * (W + 1)
for _ in range(N):
    w, v = map(int, input().split())
    for i in range(W, w - 1, -1):
        d[i] = max(d[i], d[i - w] + v)
print(d[W])

投稿日時:
最終更新: