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.


(defun count-change (amount coins
                    &optional
                    (length (1- (length coins)))
                    (cache  (make-array (list (1+ amount) (length coins))
                                        :initial-element nil)))
  (cond ((< length 0) 0)
        ((< amount 0) 0)
        ((= amount 0) 1)
        (t (or (aref cache amount length)
               (setf (aref cache amount length)
                     (+ (count-change (- amount (first coins)) coins length cache)
                        (count-change amount (rest coins) (1- length) cache)))))))
 
; (compile 'count-change) ; for CLISP
 
(print (count-change 100 '(25 10 5 1)))		   ; = 242
(print (count-change 100000 '(100 50 25 10 5 1)))  ; = 13398445413854501
(terpri)