結果
| 問題 |
No.2026 Yet Another Knapsack Problem
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 16:15:37 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,282 bytes |
| コンパイル時間 | 281 ms |
| コンパイル使用メモリ | 82,172 KB |
| 実行使用メモリ | 171,272 KB |
| 最終ジャッジ日時 | 2025-06-12 16:17:47 |
| 合計ジャッジ時間 | 78,739 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 TLE * 1 -- * 6 |
ソースコード
def main():
import sys
input = sys.stdin.read
data = input().split()
N = int(data[0])
items = []
idx = 1
for i in range(N):
c = int(data[idx])
v = int(data[idx+1])
items.append((i+1, c, v))
idx += 2
item1 = items[0]
others = items[1:]
dp2 = [[-float('inf')] * (N + 1) for _ in range(N + 1)]
dp2[0][0] = 0
for i in range(1, N):
current_i = others[i-1]
weight_i = current_i[0]
count_i = current_i[1]
value_i = current_i[2]
for y in range(N, -1, -1):
for w in range(N, -1, -1):
if dp2[y][w] == -float('inf'):
continue
max_x = min(count_i, (N - w) // weight_i)
for x in range(1, max_x + 1):
new_y = y + x
new_w = w + weight_i * x
if new_y > N or new_w > N:
break
new_val = dp2[y][w] + x * value_i
if new_val > dp2[new_y][new_w]:
dp2[new_y][new_w] = new_val
max_val = [[-float('inf')] * (N + 1) for _ in range(N + 1)]
for y in range(N + 1):
current_max = -float('inf')
for w in range(N + 1):
if dp2[y][w] > current_max:
current_max = dp2[y][w]
max_val[y][w] = current_max
result = [0] * (N + 1)
c1 = item1[1]
v1 = item1[2]
for k in range(1, N + 1):
max_total = -float('inf')
max_y = k
min_x = max(0, k - (N - 0))
x_start = max(0, k - (N - 0))
x_end = min(c1, k)
for x in range(x_start, x_end + 1):
y = k - x
if y < 0:
continue
w_max = N - x
if w_max < 0:
continue
if y > N:
continue
if w_max > N:
w_max = N
if max_val[y][w_max] == -float('inf'):
continue
total = x * v1 + max_val[y][w_max]
if total > max_total:
max_total = total
result[k] = max_total
for k in range(1, N + 1):
print(result[k])
if __name__ == "__main__":
main()
gew1fw