Given coin denominations and an amount, find:
min_coins(coins, amount): the fewest coins that make the amount exactly, or -1 if it's impossible.count_ways(coins, amount): the number of combinations (order doesn't matter) that make the amount.Greedy ("always take the biggest coin") fails for coins like [1, 3, 4] and amount 6. Use dynamic programming over amounts 0..amount.