Ex1:
Input: coins[] = {25, 10, 5}, V = 30
Output: minimum 2 coins required
Ex2:
Input: coins[] = {9, 6, 5, 1}, V = 11
Output: minimum 2 coins required
Recursive Solution
If V == 0, then 0 coins required.
If V > 0
minCoin(coins[0..m-1], V) = min {1 + minCoins(V-coin[i])}
where i varies from 0 to m-1
and coin[i] <= V
Python Naive Recursive Solution
class Solution:
def coinChange(self, coins, amount):
if amount == 0:
return 0
for i in range(0, len(coins)):
mincoins = min(1+self.coinChange(amount - coins[i]))
if mincoins + 1 < mincoins:
res = mincoins + 1
return res
DP solution
def coinChangeDP(self, coins, amount):
MAX = float('inf')
dp = [0] + [MAX]*amount
for i in range(1, amount + 1):
dp[i] = min([dp[i - c] if i - c >= 0 else MAX for c in coins]) + 1
return [dp[amount], -1][dp[amount] == MAX]