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
コメント