[AtCoder][DP][Educational DP Contest][競プロ]E-Knapsack 2

unrecognizable woman with backpack walking in forest AtCoder
Photo by Dmitriy Ganin on Pexels.com

Educational DP Contest

Educational DP Contest - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

問題

E - Knapsack 2
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
問題キャプチャ。

方針

設定は同じ問題。

上の問題と同じだけど、\(W\)が大きいので、\(NW\)のDPテーブルを作成することはできない。価値\(V\)が小さいので、これをもとにDPしていく。これも蟻本にある問題と一緒。

解答

import numpy as np
n, W = map(int, input().split())
inf = pow(10, 10)
V = 10**3
dp = np.full((n+1, n*V+1), inf)
dp[0, 0] = 0

for i in range(n):
    w, v = map(int, input().split())
    np.minimum(dp[i, v:], dp[i, :-v]+w, out = dp[i+1, v:])
    dp[i+1, :v] = dp[i, :v]

print(max(np.where(dp[n] <= W)[0]))

提出結果

Submission #31781006 - Educational DP Contest
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

感想

DPの更新でやっていることはD-KnapSack 1と一緒。最後に\(W\)以下で最大のindexを見つけるところではnumpy whereを用いている。格好良くnumpy argmaxを使おうとしたが、あまりうまくいかずやむを得ずwhereにした。

関連リンク


https://atcoder.jp/home
A-Frog 1
B-Frog 2
C-Vacation
D-KnapSack 1

コメント

タイトルとURLをコピーしました