← Practice
πŸ“– Dynamic programmingdp-coin-change
LessonΒ·difficulty 4/5Β·~22 min

DP: coin change

DP: coin change

Given coin denominations and a target amount, what is the fewest coins that add up exactly to amount? You may use each denomination as many times as you like.

Grabbing the biggest coin first (a greedy strategy) can fail: for coins [1, 3, 4] and amount 6, greedy takes 4 + 1 + 1 (3 coins), but 3 + 3 is only 2. To always get it right we build up answers for every sub-amount from 0 to amount.

Let best[a] be the fewest coins to make a. The best way to make a is to use some coin c, then optimally make a - c:

python
best[a] = 1 + min(best[a - c] for c in coins if c <= a)

We seed best[0] = 0 (zero coins make zero) and treat "impossible" as infinity.

Your task

Write coin_change(coins, amount) returning the minimum number of coins that sum to amount, or -1 if it cannot be done.

python
coin_change([1, 2, 5], 11)   # 3   -> 5 + 5 + 1
coin_change([2], 3)          # -1  -> odd amount, only even coins
coin_change([1], 0)          # 0

Hint: make a list best of size amount + 1 filled with a large sentinel, set best[0] = 0, then for each sub-amount try every coin and keep the smallest count. At the end, return -1 if best[amount] is still the sentinel.

Tests

  • classic 11
  • impossible
  • zero amount
  • greedy would fail
  • single big coin (hidden)
  • larger target (hidden)

✦ Stuck? Ask for a spark

warming up
Loading editor…

$ Console output will appear here.

>_AI tutor
Sign in to chat with the tutor.