重さの上限までに積む荷物の価値の最大

  • 動的計画法
  • 問題 17
  • やや難しい
  • 目安 45 分

配送の車に、重さの上限を越えないように荷物を選んで積むとき、価値の合計の最大を求める。重さごとの最大の価値を表に残す、動的計画法の練習です。

本番の試験は PC で受けることが多いので、PC での練習をすすめます。スマホでも、読んで、書いて、採点するところまで動きます。

入力は標準入力から読み、答えは標準出力に書きます。1 テストあたり 2 秒までです。

問題

配送の車に、N 個の荷物の中からいくつかを選んで積みます。i 個目の荷物は重さが w_i、価値が v_i です。車に積める重さの合計は W までです。

それぞれの荷物は、積むか積まないかのどちらかで、同じ荷物を 2 回積むことはできません。積んだ荷物の重さの合計が W 以下になるように選ぶとき、価値の合計の最大を出力してください。1 つも積まないときの価値の合計は 0 です。

入力の形式

N W
w_1 v_1
w_2 v_2
...
w_N v_N

1 行目に荷物の数 N と重さの上限 W が半角の空白 1 つで区切られて並びます。続く N 行は、1 行に 1 つの荷物の重さ w_i と価値 v_i です。

出力の形式

価値の合計の最大を 1 行で出力します。

制約

  • N は 1 以上 100 以下の整数です
  • W は 1 以上 10000 以下の整数です
  • w_i は 1 以上 10000 以下の整数です (W より重い荷物もあります)
  • v_i は 1 以上 2000000 以下の整数です

入力と出力の例

例 1

上限が 5 で、荷物が 4 個あります。重さ 2 で価値 3 の荷物と、重さ 3 で価値 4 の荷物を積むと、重さ 5 で価値 7 になります。これより大きい価値の積み方はありません。

入力

4 5
2 3
1 2
3 4
2 2

出力

7

例 2

上限が 3 で、どの荷物も 3 より重いので、1 つも積めません。答えは 0 です。

入力

2 3
4 10
5 20

出力

0

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

main.py
import sys

data = sys.stdin.read().split()
n, w = int(data[0]), int(data[1])
items = [(int(data[2 + 2 * i]), int(data[3 + 2 * i])) for i in range(n)]

# ここから書く

入力

出力

「実行する」を押すと、ここに出力が出ます

できているか「提出して採点」を押すと、隠れたテストを全部走らせて、通ったかをここに出します