I was looking for a good solution to the Change-making problem and I found this code(Python):
target = 200
coins = [1,2,5,10,20,50,100,200]
ways = [1]+[0]*ta
The main idea behind the code is the following:
"On each step there are ways
ways to make change of i
amount of money given coins [1,...coin]
".
So on the first iteration you have only a coin with denomination of 1
. I believe it is evident to see that there is only one way to give a change having only these coins for any target. On this step ways
array will look like [1,...1]
(only one way for all targets from 0
to target
).
On the next step we add a coin with denomination of 2
to the previous set of coins. Now we can calculate how many change combinations there are for each target from 0
to target
.
Obviously, the number of combination will increase only for targets >= 2
(or new coin added, in general case). So for a target equals 2
the number of combinations will be ways[2](old)
+ ways[0](new)
. Generally, every time when i
equals a new coin introduced we need to add 1
to previous number of combinations, where a new combination will consist only from one coin.
For target
> 2
, the answer will consist of sum of "all combinations of target
amount having all coins less than coin
" and "all combinations of coin
amount having all coins less than coin
itself".
Here I described two basic steps, but I hope it is easy to generalise it.
Let me show you a computational tree for target = 4
and coins=[1,2]
:
ways[4] given coins=[1,2] =
ways[4] given coins=[1] + ways[2] given coins=[1,2] =
1 + ways[2] given coins=[1] + ways[0] given coins=[1,2] =
1 + 1 + 1 = 3
So there are three ways to give a change: [1,1,1,1], [1,1,2], [2,2]
.
The code given above is completely equivalent to the recursive solution. If you understand the recursive solution, I bet you understand the solution given above.