結果
| 問題 |
No.2686 商品券の使い道
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-03-20 23:34:42 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,571 ms / 3,000 ms |
| コード長 | 1,988 bytes |
| コンパイル時間 | 150 ms |
| コンパイル使用メモリ | 82,316 KB |
| 実行使用メモリ | 188,340 KB |
| 最終ジャッジ日時 | 2024-09-30 09:37:14 |
| 合計ジャッジ時間 | 42,900 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 48 |
ソースコード
n, m, q = map(int, input().split())
# import sys
# input = sys.stdin.readline
# mp = map(int, sys.stdin.read().split())
# ab = list(zip(mp,mp))
ab = []
for i in range(n):
a,b = map(int, input().split())
ab.append((a,b))
katidp = [[0 for i in range(1 << n)] for i in range(2)]
resdp = [[0 for i in range(1 << n)] for i in range(2)]
resdp[0][0] = m
resdp[1][0] = q
que = set([0])
for j in range(n):
nq = set()
while que:
state = que.pop()
mkati = katidp[0][state]
qkati = katidp[1][state]
mres = resdp[0][state]
qres = resdp[1][state]
for k in range(n):
if state & (1 << k):
continue
else:
nstate = state | (1 << k)
nq.add(nstate)
kati = ab[k][1]
val = ab[k][0]
if mres < val:
nres = mres
nkati = mkati
else:
nkati = mkati + kati
nres = mres - val
if katidp[0][nstate] < nkati:
katidp[0][nstate] = nkati
resdp[0][nstate] = nres
elif katidp[0][nstate] == nkati:
if resdp[0][nstate] < nres:
resdp[0][nstate] = nres
if qres < val:
nres = qres
nkati = qkati
else:
nkati = qkati + kati
nres = qres - val
if katidp[1][nstate] < nkati:
katidp[1][nstate] = nkati
resdp[1][nstate] = nres
elif katidp[1][nstate] == nkati:
if resdp[1][nstate] < nres:
resdp[1][nstate] = nres
que = nq
# print(katidp)
mask = (1 << n) - 1
ans = 0
for i in range(1 << n):
j = mask ^ i
ans = max(ans, katidp[0][i] + katidp[1][j])
print(ans)