| Problem 147 - Dollars, Explanations |
As most of the dynamic programming problems, just knowing the property of the reminder array is enough to solve the problem.
The array will be bidimensionnal, with the first dimension beeing an amount and the second beeing a currency.
Each cell of the array will be the number of ways to do the given amount with currencies not bigger than the given currency.
To compute the number of ways to do AMOUNT with currencies not bigger than CURRENCY:
For each currency smaller or equal than CURRENCY...
The complicated thing is to count two times 0.5 + 0.10 + 0.5 and 0.5 + 0.5 + 0.10.
Beware to cast! (int)(f*100) will never give you what you expect.
Handle 300.00
Of course, an integer in a width of 17 is a big integer.
Do not explode the memory limit, do not keep more than (300 / mincurrency) * numcurrency big integer records.
If you are in trouble with the multi-entry input, read my how to read input.
New Zealand currency consists of $100, $50, $20, $10, and $5
notes and $2, $1, 50c, 20c, 10c and 5c coins. Write a program that
will determine, for any given amount, in how many ways that amount may
be made up. Changing the order of listing does not increase the count.
Thus 20c may be made up in 4 ways: 1
20c, 2
10c, 10c+2
5c, and 4
5c.
Input will consist of a series of real numbers no greater than $300.00 each on a separate line. Each amount will be valid, that is will be a multiple of 5c. The file will be terminated by a line containing zero (0.00).
Output will consist of a line for each of the amounts in the input, each line consisting of the amount of money (with two decimal places and right justified in a field of width 6), followed by the number of ways in which that amount may be made up, right justified in a field of width 17.
0.20 2.00 0.00
0.20 4 2.00 293