AtCoder Beginners SelectionにRubyで挑戦 #4

AtCoder初心者がやるべき問題集、AtCoder Beginners Selectionに挑戦。

各問題の制約や入出力例などは引用元リンク(AtCoderのサイト)へ。

ABC087B - Coins

問題文
あなたは、500 円玉を A 枚、100 円玉を B 枚、50 円玉を C 枚持っています。 これらの硬貨の中から何枚かを選び、合計金額をちょうど X 円にする方法は何通りありますか。
同じ種類の硬貨どうしは区別できません。2 通りの硬貨の選び方は、ある種類の硬貨についてその硬貨を選ぶ枚数が異なるとき区別されます。

入力
入力は以下の形式で与えられる。
A
B
C
X

ABC087B - Coins

ACコード

a = gets.to_i
b = gets.to_i
c = gets.to_i
x = gets.to_i
ans = 0
(0..a).each do |i|
  (0..b).each do |j|
    (0..c).each do |k|
      ans += 1 if (500 * i) + (100 * j) + (50 * k) == x
    end
  end
end
puts ans

実行時間:62 ms

前回ぐらいから難しくなってきた。ちょっとカンニングした。ごめんなさい。

each入れ子にするとどういうことが起こるか。

(例)a = 2, b = 2, c = 2, x = 100

  • まず、1回目は a = 0, b = 0, c = 0 で ans += 1 if (500 * i) + (100 * j) + (50 * k) == xが評価される。答えは 0 なので ans は 0 のまま。
  • 次は、a = 0, b = 0, c = 1 で評価。50。
  • 次は、a = 0, b = 0, c = 2 で評価。x = 100 なので ans = 1。
  • 次は、a = 0, b = 1, c = 0 で評価。x = 100 なので ans = 2。
  • 次は、a = 0, b = 1, c = 1 で評価。150。
  • 次は、a = 0, b = 1, c = 2 で評価。200。
  • 次は、a = 0, b = 2, c = 0 で評価。200。
  • 次は、a = 0, b = 2, c = 1 で評価。250。
  • 次は、a = 0, b = 2, c = 2 で評価。300。
  • 次は、a = 1, b = 0, c = 0 で評価。500。
  • 次は、a = 1, b = 0, c = 1 で評価。550。
  • 次は、a = 1, b = 0, c = 2 で評価。600。
  • 次は、a = 1, b = 1, c = 0 で評価。600。
  • 次は、a = 1, b = 1, c = 1 で評価。650。
  • 次は、a = 1, b = 1, c = 2 で評価。700。
  • 次は、a = 1, b = 2, c = 0 で評価。700。
  • 次は、a = 1, b = 2, c = 1 で評価。750。
  • 次は、a = 1, b = 2, c = 2 で評価。800。
  • 次は、a = 2, b = 0, c = 0 で評価。1000。
  • 次は、a = 2, b = 0, c = 1 で評価。1050。
  • 次は、a = 2, b = 0, c = 2 で評価。1100。
  • 次は、a = 2, b = 1, c = 0 で評価。1100。
  • 次は、a = 2, b = 1, c = 1 で評価。1150。
  • 次は、a = 2, b = 1, c = 2 で評価。1200。
  • 次は、a = 2, b = 2, c = 0 で評価。1200。
  • 次は、a = 2, b = 2, c = 1 で評価。1250。
  • 次は、a = 2, b = 2, c = 2 で評価。1300。

という感じで、全27通りの組み合わせを評価することができる。