結果
| 問題 |
No.50 おもちゃ箱
|
| コンテスト | |
| ユーザー |
chocorusk
|
| 提出日時 | 2020-09-10 04:27:47 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 920 ms / 5,000 ms |
| コード長 | 910 bytes |
| コンパイル時間 | 353 ms |
| コンパイル使用メモリ | 82,112 KB |
| 実行使用メモリ | 85,348 KB |
| 最終ジャッジ日時 | 2024-12-17 22:17:06 |
| 合計ジャッジ時間 | 14,148 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 38 |
ソースコード
import sys
read=sys.stdin.buffer.read
readline=sys.stdin.buffer.readline
readlines=sys.stdin.buffer.readlines
import itertools
n=int(readline())
a=list(map(int, readline().split()))
m=int(readline())
b=list(map(int, readline().split()))
ok=[[False]*(1<<n) for _ in range(m)]
for i in range(1<<n):
s=sum(x for j, x in enumerate(a) if i&(1<<j))
for j, y in enumerate(b):
if s<=y:
ok[j][i]=True
dp=[False]*(1<<(n+m))
dp[0]=True
for i in range(1<<(n+m)):
j0=m
for j in range(m):
if i&(1<<j):
j0=j
break
else:
continue
mask=i&(((1<<n)-1)<<m)
k=mask
while k:
if ok[j0][k>>m] and dp[i^k^(1<<j0)]:
dp[i]=True
break
k=(k-1)&mask
def popcount(x):
return bin(x).count('1')
ans=[popcount(i) for i in range(1<<m) if dp[(((1<<n)-1)<<m)^i]]
if ans:
print(min(ans))
else:
print(-1)
chocorusk