公式
C - 残り時間の買い物 / Shopping with Remaining Time 解説
by
C - 残り時間の買い物 / Shopping with Remaining Time 解説
by
harurun4635
問題を定式化すれば、いわゆる 01 knapsack と呼ばれる問題です。
容量 \(T - S\) の knapsack に、重さ \(C_i\)、 価値 \(P_i\) の商品 \(i \ (1 \le i \le N)\) を詰めるときの価値の最大化です。これは
\(\mathrm{dp}[i][j] =\) 商品 \(i\) までを入れるかどうか決めて、重さ \(j\) を使っている時の価値の総和の最大値
とした dp を考えることで、状態 \(O(N(T - S))\) 遷移 \(O(1)\) で解く事ができます。実際には、 \(i\) の添字は持たずに、遷移の順番 \(j\) の降順にするテクニックがよく用いられます。
実装例
n, t, s = map(int, input().split())
dp = [0] * (t - s + 1)
for i in range(n):
c, p = map(int, input().split())
for j in reversed(range(t - s + 1 - c)):
dp[j + c] = max(dp[j + c], dp[j] + p)
print(max(dp))
投稿日時:
最終更新: