結果
| 問題 |
No.2869 yuusaan's Knapsacks
|
| コンテスト | |
| ユーザー |
寝癖
|
| 提出日時 | 2024-07-19 00:13:06 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,180 bytes |
| コンパイル時間 | 219 ms |
| コンパイル使用メモリ | 82,892 KB |
| 実行使用メモリ | 162,896 KB |
| 最終ジャッジ日時 | 2024-08-04 18:04:28 |
| 合計ジャッジ時間 | 48,273 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 26 TLE * 1 |
ソースコード
from dataclasses import dataclass
N, M = map(int, input().split())
e = list(map(int, input().split()))
v, w = map(list, zip(*[map(int, input().split()) for _ in range(M)]))
@dataclass
class Data:
v: int
use: int
prev: 'Data'
sum_v, sum_w = [0]*(1<<M), [0]*(1<<M)
for S in range(1<<M):
for j in range(M):
if S>>j&1:
sum_v[S] += v[j]
sum_w[S] += w[j]
now = [Data(0, 0, None) for _ in range(1<<M)]
for i in range(N):
nxt = [Data(0, 0, None) for _ in range(1<<M)]
for S in range(1<<M):
U = (1<<M)-1-S
T = U
while True:
if sum_w[T] <= e[i] and now[S].v+sum_v[T] > nxt[S|T].v:
nxt[S|T].v = now[S].v+sum_v[T]
nxt[S|T].use = T
nxt[S|T].prev = now[S]
if T == 0:
break
T = (T-1)&U
now = nxt
m = max(now[S].v for S in range(1<<M))
S = [S for S in range(1<<M) if now[S].v == m][0]
cur = now[S]
ans = []
while cur.prev:
ans.append([i+1 for i in range(M) if cur.use>>i&1])
cur = cur.prev
if len(ans) != N:
ans += [[]]*(N-len(ans))
print(m)
for a in ans[::-1]:
print(len(a), *a)
寝癖