ちょうどの金額を払う硬貨の最少の枚数

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

何種類かの硬貨を何枚でも使えるとき、ちょうど X 円にする最少の枚数を求める。大きい硬貨から使う貪欲法では外れる場合があり、金額ごとの答えを表に残す動的計画法で解く練習です。

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

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

問題

ある国の売店のレジには、K 種類の硬貨があり、i 種類目の硬貨は c_i 円です。どの種類の硬貨も、何枚でも使えます。

お釣りを出さずに、ちょうど X 円を払いたいと考えています。使う硬貨の枚数の合計が最も少なくなるときの枚数を出力してください。どう組み合わせても X 円ちょうどにできないときは -1 を出力してください。

入力の形式

K X
c_1 c_2 ... c_K

1 行目に硬貨の種類の数 K と払う金額 X が、2 行目に K 種類の硬貨の額 c_i が、それぞれ半角の空白 1 つで区切られて並びます。硬貨の額は小さい順とは限りません。

出力の形式

最少の枚数を 1 行で出力します。払えないときは -1 を出力します。

制約

  • K は 1 以上 10 以下の整数です
  • X は 1 以上 100000 以下の整数です
  • c_i は 1 以上 100000 以下の整数で、どの 2 つも違う額です

入力と出力の例

例 1

1 円、3 円、4 円の硬貨で 6 円を払います。いちばん大きい 4 円から使うと 4 + 1 + 1 の 3 枚になりますが、3 + 3 なら 2 枚で払えます。答えは 2 です。

入力

3 6
1 3 4

出力

2

例 2

2 円と 4 円の硬貨では、何枚使っても合計は偶数なので、7 円ちょうどは払えません。

入力

2 7
2 4

出力

-1

ヒント

まだ開いていません

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

  1. ヒント 2

  2. ヒント 3答えに近い

main.py
import sys

data = sys.stdin.read().split()
k, x = int(data[0]), int(data[1])
coins = list(map(int, data[2:2 + k]))

# ここから書く

入力

出力

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

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