def make_change(amount, coins = [25, 10, 5, 1])
change = { 0 => [] }
until change.has_key?(amount)
new_change = {}
change.each do |amt, chg|
coins.each { |c| new_change[amt + c] = [c] + chg unless
amt + c > amount or change.has_key?(amt + c) }
end
return nil if new_change.empty?
change.merge!(new_change)
end
change[amount].sort.reverse
end
-------------------
We begin with the simplest known solution (0 => []). Now for each
known solution and for each coin we get new solutions by just adding
the coin. This is repeated until we get a solution for the given
amount. If we don't find any new solutions (new_change.empty?) there
isn't any, so we return just nil.