Denominions of the coins:
Problem: find the smallest # coins to make change for K cents
Example: make change for 5c:
Solution: MC(5) = 1 (coin)
Caveta: the greedy method will not work:
Problem: design an algorithm to find the smallest # coins to make change for the given values
Problem description: find smallest # coins to make change for 27c
Divide step: find the smaller problems that are helpful
Hint: we must use one of the 4 coins to make change !!!... Try all posibilties !!!
Divide step: find the smaller problems that are helpful
Question: which smaller problems do we need to use ??
Divide step: if we use coin with value 1, we need to make change for 27 − 1 = 26c:
Question: which smaller problems do we need to use ??
Divide step: if we use coin with value 3, we need to make change for 27 − 3 = 24c:
Question: which smaller problems do we need to use ??
Divide step: if we use coin with value 5, we need to make change for 27 − 5 = 22c:
Question: which smaller problems do we need to use ??
Divide step: if we use coin with value 8, we need to make change for 27 − 8 = 19c:
Question: which smaller problems do we need to use ??
Divide step completed: we have found the smaller problems that are helpful
Conquer step: how do we solve MC(27) if we are given the solutions for the smaller problems ?
Conquer: suppose that you know these solutions:
What is the smallest # coins used to make change for 27c ???
Conquer: find the smallest number of coins that we need to use:
What is the smallest # coins used to make change for 27c ???
Divide and conquer: use the solutions of the smaller problems
Answer: MC(27) = 4 coins (3 + 1)
Suppose we need to solve the MC(27) problem:
Find the (useful) smaller problems to solve MC(27)
Use the solutions for the smaller problems to solve the original problem:
Note: we already have the solution, e.g., we know that MC(26) is equal to 4, etc !
We solve MC(27) using the values 4+1.3+1.4+1.3+1:
This is the essence of a recursive algorithm
def MC(amount): helpSol = [None,None,None,None] # These are my SOLVED problems # Base case: change for $0 uses no coins if (amount == 0): return 0 # Find solutions for the smaller problems used to solve MC(amount) # 1st smaller problem when I use a coin with value 8 # ** I can only use this coin if we make change for an amount >= 8 ** if ( amount >= 8 ): helpSol[0] = MC(amount-8) # DELEGATE ! # min num coins used to make change for amount-8 # 2nd smaller problem when I use a coin with value 5 # ** I can only use this coin if we make change for an amount >= 5 ** if ( amount >= 5 ): helpSol[1] = MC(amount-5) # DELEGATE ! # min num coins used to make change for amount-5 # 3rd smaller problem when I use a coin with value 3 # ** I can only use this coin if we make change for an amount >= 3 ** if ( amount >= 3 ): helpSol[2] = MC(amount-3) # DELEGATE ! # min num coins used to make change for amount-3 # 4th smaller problem when I use a coin with value 1 # ** I can only use this coin if we make change for an amount >= 1 ** if ( amount >= 1 ): helpSol[3] = MC(amount-1) # DELEGATE ! # min num coins used to make change for amount-1 # Solve my problem USING the smaller solutions: mySol = min( x for x in helpSol if x != None) + 1 return mySol |
DEMO: C:\ClassUp\mc.py