結果
| 問題 | No.3329 Only the Rightest Choice is Right!!! |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-08-11 19:13:09 |
| 言語 | PyPy2 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 758 ms / 1,571 ms |
| コード長 | 1,650 bytes |
| コンパイル時間 | 695 ms |
| コンパイル使用メモリ | 77,376 KB |
| 実行使用メモリ | 361,664 KB |
| 最終ジャッジ日時 | 2025-11-02 16:30:20 |
| 合計ジャッジ時間 | 21,290 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 74 |
ソースコード
import sys
def solve(N, W, v, w):
"""
N: 品物の数
W: 重量制限
v: 価値リスト (長さ N)
w: 重さリスト (長さ N)
戻り値: 選択された品物の 1-based インデックスリスト
"""
# dp[i][j] = (最大価値, 次に選ばれた状態の i index)
dp = [[(0, None) for _ in xrange(W+1)] for _ in xrange(N+1)]
# 後ろから DP テーブルを埋める
for i in xrange(N-1, -1, -1):
vi = v[i]
wi = w[i]
dpi1 = dp[i+1]
dpi = dp[i]
# 重さが足りない場合はスキップ(選ばない)
for j in xrange(wi):
dpi[j] = dpi1[j]
# 重さを使える場合は選ぶ or 選ばないを比較
for j in xrange(wi, W+1):
val_skip, nxt_skip = dpi1[j]
val_take = dpi1[j-wi][0] + vi
if val_skip >= val_take:
dpi[j] = (val_skip, nxt_skip)
else:
dpi[j] = (val_take, i+1)
# トレースバック
ans = []
idx = dp[0][W][1]
rem = W
while idx is not None:
ans.append(idx)
rem -= w[idx-1]
idx = dp[idx][rem][1]
return ans
def main():
data = sys.stdin.read().split()
it = iter(data)
# Python2 では it.next() を使う
N = int(it.next())
W = int(it.next())
v = [int(it.next()) for _ in xrange(N)]
w = [int(it.next()) for _ in xrange(N)]
ans = solve(N, W, v, w)
# 出力
out = []
out.append(str(len(ans)))
if ans:
out.append(" ".join(map(str, ans)))
sys.stdout.write("\n".join(out))
if __name__ == "__main__":
main()