結果
| 問題 |
No.2026 Yet Another Knapsack Problem
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-15 22:34:26 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,259 bytes |
| コンパイル時間 | 165 ms |
| コンパイル使用メモリ | 82,012 KB |
| 実行使用メモリ | 77,680 KB |
| 最終ジャッジ日時 | 2025-04-15 22:36:44 |
| 合計ジャッジ時間 | 41,525 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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 = []
index = 1
for i in range(N):
c_i = int(data[index])
v_i = int(data[index + 1])
items.append((c_i, v_i))
index += 2
INF = -10**18
dp = [[INF] * (N + 1) for _ in range(N + 1)]
dp[0][0] = 0
for idx in range(N):
i = idx + 1 # item type (weight)
c_i, v_i = items[idx]
remaining = c_i
t = 1
while remaining > 0:
take = min(t, remaining)
# Update DP in reverse order
for k in range(N, -1, -1):
for w in range(N, -1, -1):
if dp[k][w] == INF:
continue
new_k = k + take
new_w = w + take * i
if new_k > N or new_w > N:
continue
if dp[new_k][new_w] < dp[k][w] + take * v_i:
dp[new_k][new_w] = dp[k][w] + take * v_i
remaining -= take
t *= 2
# Compute answers
for k in range(1, N + 1):
max_val = max(dp[k][k:N+1])
print(max_val)
if __name__ == "__main__":
main()
lam6er