結果
| 問題 |
No.2364 Knapsack Problem
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-07-01 09:20:37 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 2,481 ms / 3,000 ms |
| コード長 | 1,092 bytes |
| コンパイル時間 | 168 ms |
| コンパイル使用メモリ | 82,176 KB |
| 実行使用メモリ | 163,968 KB |
| 最終ジャッジ日時 | 2024-07-07 20:12:38 |
| 合計ジャッジ時間 | 23,903 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 20 |
ソースコード
"""
reference:
https://yukicoder.me/submissions/886509
[解法]
まず、魔法は重さ-w、価値-vのものの購入と考えることで、操作は一通りにしておける。
操作は順番が違っても同じ重さと価値を得ることに気づきたい。
そうすると、操作の並び替えは必要なく、操作の小さい方から確定させていくことで、回答できる。
(これはbitDP。)
"""
N, M, W = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
A += list(map(lambda x: -int(x), input().split()))
B += list(map(lambda x: -int(x), input().split()))
# bitDP
# dp[s][w]: 行った操作の集合がsで重さがwである時の価値の最大値
dp = [[-float('inf')] * (W + 1) for _ in range(2**(N+M))]
dp[0][0] = 0
for s in range(2**(N+M)):
for w in range(W+1):
for i in range(N+M):
if s >> i & 1 and 0 <= w - A[i] <= W and dp[s-2**i][w-A[i]] != -float('inf'):
dp[s][w] = max(dp[s][w], dp[s-2**i][w-A[i]] + B[i])
ans = -float('inf')
for i in dp:
ans = max(ans, max(i))
print(ans)