AtCoder Begginers Selection "Coins"
500円玉、100円玉、50円玉の3種類の硬貨の枚数と合計金額が与えられ、合計金額ちょうどとなる枚数の選び方は何通りあるか
合計金額ちょうどになるときの判定の仕方と、そのカウントをどうしたらいいのか。
合計金額ちょうどの判定方法は、
[合計金額]
=500 × [500円玉の枚数] + 100 × [100円玉の枚数] + 50 × [50円玉の枚数]
で判定できるので、このときに発見した判定方法の数を1つ増やすことができる。
そして、各硬貨の枚数は、標準入力で与えられるので、0枚からその枚数までカウントアップして、そのそれぞれの場合に上記の判定式に当てはまるかどうかを調べていけばいいので、
・500円玉が0枚から最大枚数まで
・・100円玉が0枚から最大枚数まで
・・・50円玉が0枚から最大枚数まで
の3重ループで実現できるから、提出したコードは次の通りになりました。
# -*- coding: utf-8 -*- def cntCoins(num500, num100, num50, sumPrice): ways = 0 # 500円玉を0枚から持っている枚数までループ for i in range(num500 + 1): # 100円玉を0枚から持っている枚数までループ for j in range(num100 + 1): # 50円玉を0枚から持っている枚数までループ for k in range(num50 + 1): if i * 500 + j * 100 + k * 50 == sumPrice: ways += 1 return ways ######### # 枚数の入力 num500 = int(input()) num100 = int(input()) num50 = int(input()) # 合計金額の入力 sumPrice = int(input()) print(cntCoins(num500, num100, num50, sumPrice))
最初、range()関数の引数に与えた数までカウントしてくれないことを知らず、そこ少し手こずってしまった。たとえば、range(5)を与えると、その戻り値は[0, 1, 2, 3, 4]となるんだね。引数に与えた数値はMAXではなく、0からのカウント数と覚えなくては。