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.


 
%% Count_The_Coins
clear;close all;clc;
tic
 
for i = 1:2 % 1st loop is main challenge 2nd loop is optional challenge
    if (i == 1)
        amount = 100;                       % Matlab indexes from 1 not 0, so we need to add 1 to our target value                        
        amount = amount + 1;                    
        coins = [1 5 10 25];                % Value of coins we can use
    else
        amount = 100*1000;                  % Matlab indexes from 1 not 0, so we need to add 1 to our target value                        
        amount = amount + 1; 
        coins = [1 5 10 25 50 100];         % Value of coins we can use
    end % End if
    ways = zeros(1,amount);                 % Preallocating for speed
    ways(1) = 1;                            % First solution is 1
 
    % Solves from smallest sub problem to largest (bottom up approach of dynamic programming).
    for j = 1:length(coins)                 
        for K = coins(j)+1:amount           
            ways(K) = ways(K) + ways(K-coins(j));   
        end % End for
    end % End for
        if (i == 1)
            fprintf(‘Main Challenge: %d \n', ways(amount));
        else
            fprintf(‘Bonus Challenge: %d \n', ways(amount));
        end % End if 
end % End for
toc
 