結果
| 問題 | No.2866 yuusaan's Knapsack |
| コンテスト | |
| ユーザー |
norioc
|
| 提出日時 | 2026-10-25 21:37:46 |
| 言語 | PyPy3 (8.0.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 338 ms / 2,000 ms |
| + 823µs | |
| コード長 | 858 bytes |
| 記録 | |
| コンパイル時間 | 80 ms |
| コンパイル使用メモリ | 64,628 KB |
| 実行使用メモリ | 90,876 KB |
| 最終ジャッジ日時 | 2026-10-25 21:37:55 |
| 合計ジャッジ時間 | 4,814 ms |
|
ジャッジサーバーID (参考情報) |
judge5_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
from collections import defaultdict
MOD = 998244353
INF = 1 << 62
N, W = map(int, input().split())
items = []
for i in range(N):
v, w = map(int, input().split())
items.append((v, w))
# key : 重さ
# val : (最大価値, 通り数)
dp = {0: (0, 1)}
for v, w in items:
pp = dp.copy()
dp, pp = pp, dp
for w0, (v0, cnt0) in pp.items():
nw = w0 + w
nv = v0 + v
if nw > W + 10000: # 負の重さがあるので上限値で枝刈り
continue
prev = dp.get(nw)
if prev is None or prev[0] < nv:
dp[nw] = (nv, cnt0)
elif prev[0] == nv:
dp[nw] = (nv, (prev[1] + cnt0) % MOD)
max_v = max(v for w, (v, _) in dp.items() if w <= W)
ways = 0
for w, (v, cnt) in dp.items():
if w <= W and v == max_v:
ways += cnt
ways %= MOD
print(max_v, ways)
norioc