Given an infinite number of quarters (25 cents), dimes (10 cents), nickels (5 cents), and pennies (1 cent), write code to calculate the number of ways of representing n cents. (The result may be large, so you should return it modulo 1000000007)
Example1:
Input: n = 5
Output: 2
Explanation: There are two ways:
5=5
5=1+1+1+1+1
Example2:
Input: n = 10
Output: 4
Explanation: There are four ways:
10=10
10=5+5
10=5+1+1+1+1+1
10=1+1+1+1+1+1+1+1+1+1
Notes:
You can assume:
0 <= n <= 1000000
Solutions
Solution 1: Dynamic Programming
Thinking
Make amount \(n\) with coins \(25,10,5,1\), order ignored. Nested loops over counts work, and they are the unbounded knapsack recurrence.
\(f[i][j]\) is the number of ways with the first \(i\) coins. The transition is \(f[i][j]=f[i-1][j]+f[i][j-c_i]\) when \(j\ge c_i\).
Four coin types fit a \(5\times(n+1)\) table; \(f[0][0]=1\) is the empty way. Reduce modulo \(10^9+7\).
We define \(f[i][j]\) as the number of ways to make up the total amount \(j\) using only the first \(i\) types of coins. Initially, \(f[0][0]=1\), and the rest of the elements are \(0\). The answer is \(f[4][n]\).
Considering \(f[i][j]\), we can enumerate the number of the \(i\)-th type of coin used, \(k\), where \(0 \leq k \leq j / c_i\), then \(f[i][j]\) is equal to the sum of all \(f[i−1][j−k \times c_i]\). Since the number of coins is infinite, \(k\) can start from \(0\). That is, the state transition equation is as follows:
Row \(i\) reads only row \(i-1\) and smaller \(j\) on the same row, so the first index can be dropped.
A one-dimensional array updated in increasing \(j\) keeps the same recurrence in \(O(n)\) space.
We notice that the calculation of \(f[i][j]\) is only related to \(f[i−1][..]\). Therefore, we can remove the first dimension and optimize the space complexity to \(O(n)\).