There are four types of common coins in   US   currency:

   quarters   (25 cents)
   dimes   (10 cents)
   nickels   (5 cents),   and 
   pennies   (1 cent) 


There are six ways to make change for 15 cents:

   A dime and a nickel 
   A dime and 5 pennies
   3 nickels
   2 nickels and 5 pennies
   A nickel and 10 pennies
   15 pennies


Task

How many ways are there to make change for a dollar using these common coins?     (1 dollar = 100 cents).



Optional

Less common are dollar coins (100 cents);   and very rare are half dollars (50 cents).   With the addition of these two coins, how many ways are there to make change for $1000?

(Note:   the answer is larger than   232).



References

 an algorithm from the book Structure and Interpretation of Computer Programs.
 an article in the algorithmist.
 Change-making problem on Wikipedia.


procedure main()
 
   US_coins       := [1, 5, 10, 25]
   US_allcoins    := [1,5,10,25,50,100]
   EU_coins       := [1, 2, 5, 10, 20, 50, 100, 200]
   CDN_coins      := [1,5,10,25,100,200]
   CDN_allcoins   := [1,5,10,25,50,100,200]
 
   every trans := ![ [15,US_coins], 
                     [100,US_coins], 
                     [1000*100,US_allcoins] 
                  ] do 
      printf("There are %i ways to count change for %i using %s coins.\n",CountCoins!trans,trans[1],ShowList(trans[2]))
end
 
procedure ShowList(L)            # helper list to string 
every (s := "[ ") ||:= !L || " "
return s || "]"
end