Coin Change
いくつかの異なる額面の硬貨を無制限に使えるとして、できるだけ少ない枚数でちょうどの金額を支払いたいとします。
金額に収まる中で最も大きい硬貨を取るのがよさそうに思えますが、うまくいかないことがあります。硬貨が [1, 3, 4] で金額が 6 の場合、最初に最大の硬貨を使うと 4 + 1 + 1 となり、3枚必要です。一方、3 + 3 なら2枚で済みます。
より確実なのは、小さな金額から答えを積み上げていく方法です。fewest[t] を、合計が t になる最少枚数とします。0 を支払うのに硬貨は必要ありません。それ以外の t では、最後に使う硬貨の額面を c とすると、その前に残っている金額は t - c なので、次のようになります。
fewest[t] = 1 + t 以下のすべての硬貨 c についての fewest[t - c] の最小値。
[1, 3, 4] の場合、fewest[3] = 1 であり、fewest[6] = 1 + fewest[3] = 2 です。どの硬貨を使っても到達可能な金額にならない場合、t はまったく支払えません。
coinChangeという名前の関数を作成してください。この関数は、互いに異なるコインの額面のリストであるcoinsと整数のamountを受け取り、合計がちょうどamountになる最少のコイン枚数を返します。各額面のコインは何度でも使用できます。金額を作れない場合は-1を返し、amountが0の場合は0を返してください。
たとえば、coins = [2, 5, 10]、amount = 27の場合は4(10 + 10 + 5 + 2)を返し、coins = [4, 6]、amount = 7の場合は-1を返します。
制約: 1 <= coins.length <= 12、1 <= coins[i] <= 10^4、すべての値は互いに異なる、0 <= amount <= 10^4。
関数
- arg1integer-array
- arg2integer
- 戻り値integer
例
- 入力
- arg1 = [2, 5, 10]arg2 = 27
- 出力
- 4
- 入力
- arg1 = [4, 6]arg2 = 7
- 出力
- -1
- 入力
- arg1 = [3, 7]arg2 = 0
- 出力
- 0
提出時に隠しテスト+12件
ヒント
1つずつ開いてください。開くたびに少しずつ答えに近づきます。
入る中で最も大きい硬貨を常に選んでも、必ずしも硬貨の枚数が最少になるとは限りません。硬貨
[1, 3, 4]、金額6で試してみましょう。tより小さいすべての金額について、必要なコインの枚数が最小となる枚数をすでに知っているとします。どの小さい金額からなら、コインを1枚追加してtに到達できますか?テーブル
fewest[0..amount]を0から順に埋めます。fewest[0] = 0とし、各fewest[t]は、コインc <= tに対する最良のfewest[t - c]に 1 を加えた値です。到達できない金額には、実際の答えより大きな値(たとえばamount + 1)を設定し、最後に-1に変えます。
この問題の詳しい解説は準備中です。
似た問題
同じ考え方を使う問題です。2〜3問解くとパターンが身につきます。
Python
def coinChange(coins, amount):
# ここにコードを書いてくださいケース1
ケース2
ケース3
入力
arg1 = [2, 5, 10] arg2 = 27
期待値
4