(備忘録)AtCoderをやって 2(Coins)

問題文

あなたは、500 円玉を A 枚、100 円玉を B 枚、50 円玉を C 枚持っています。 これらの硬貨の中から何枚かを選び、合計金額をちょうど X 円にする方法は何通りありますか。

同じ種類の硬貨どうしは区別できません。2 通りの硬貨の選び方は、ある種類の硬貨についてその硬貨を選ぶ枚数が異なるとき区別されます。

制約

0≤A,B,C≤50

A+B+C≥1

50≤X≤20,000

A,B,C は整数である

X は 50 の倍数である

入力

入力は以下の形式で標準入力から与えられる。

A
B
C
X

自分の回答(他の方の回答拝見しました。。。)

合計金額にマッチするようにそれぞれの硬貨の枚数をどう出していき、そのパターンをどう作っていくかがわかりませんでした。 範囲オブジェクトとeachをネストさせて実現出来るんですね。。。

a = gets.chomp.to_i
b = gets.chomp.to_i
c = gets.chomp.to_i
x = gets.chomp.to_i

def coins(yen500, yen100, yen50, total_yen)
  cnt = 0
  (0..yen500).each do |a|
    (0..yen100).each do |b|
      (0..yen50).each do |c|
        if a * 500 + b * 100 + c * 50 == total_yen
          cnt += 1
        end
      end
    end
  end
  puts cnt
end

coins(a, b, c, x)

その他回答

A, B, C, x = 4.times.map{gets.to_i}
count = 0
(0..A).each{|a|
  (0..B).each{|b|
    (0..C).each{|c|
      x == (500*a + 100*b + 50*c) ? count +=1 : count += 0
    }
  }
}
puts cnt