結果
| 問題 |
No.3329 Only the Rightest Choice is Right!!!
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-08-13 23:23:16 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 580 ms / 1,571 ms |
| コード長 | 1,629 bytes |
| コンパイル時間 | 347 ms |
| コンパイル使用メモリ | 82,320 KB |
| 実行使用メモリ | 342,500 KB |
| 最終ジャッジ日時 | 2025-11-02 16:31:27 |
| 合計ジャッジ時間 | 16,494 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 74 |
ソースコード
import sys
def solve(N, W, v, w):
# dp_value[i][j]: i番目以降で重さjまで取りうる価値の最大値
# dp_next[i][j]: 最適解の次に取るアイテムの1-basedインデックス、なければ None
dp_value = [[0] * (W + 1) for _ in range(N + 1)]
dp_next = [[None] * (W + 1) for _ in range(N + 1)]
# 後ろからDP
for i in range(N - 1, -1, -1):
wi, vi = w[i], v[i]
# 重さ不足で取れない場合
for j in range(wi):
dp_value[i][j] = dp_value[i + 1][j]
dp_next[i][j] = dp_next[i + 1][j]
# 取るか取らないかの比較
for j in range(wi, W + 1):
no_take = dp_value[i + 1][j]
take = dp_value[i + 1][j - wi] + vi
if no_take >= take:
dp_value[i][j] = no_take
dp_next[i][j] = dp_next[i + 1][j]
else:
dp_value[i][j] = take
dp_next[i][j] = i + 1 # 1-based index
# トレースバックして選ばれたアイテムを列挙
ans = []
budget = W
nxt = dp_next[0][W]
while nxt is not None:
ans.append(nxt)
budget -= w[nxt - 1]
nxt = dp_next[nxt][budget]
return ans
def main():
data = sys.stdin.read().split()
it = iter(data)
N = int(next(it))
W = int(next(it))
v = [int(next(it)) for _ in range(N)]
w = [int(next(it)) for _ in range(N)]
ans = solve(N, W, v, w)
out = sys.stdout.write
out(f"{len(ans)}\n")
if ans:
out(" ".join(map(str, ans)) + "\n")
if __name__ == "__main__":
main()