Coin Change II
Problem Statement
Given coins and an amount, count how many ways you can make that amount using any number of each coin. This medium-level DP twist is a combinatorics delight—how many coin combos can you craft?
Example
Input: amount = 5, coins = [1, 2, 5]
Output: 4 (5, 2+2+1, 2+1+1+1, 1+1+1+1+1)
Input: amount = 3, coins = [2]
Output: 0 (no way)
Input: amount = 10, coins = [10]
Output: 1 (10)
Code
Java
Python
JavaScript
public class Solution {
public int change(int amount, int[] coins) {
int[] dp = new int[amount + 1];
dp[0] = 1;
for (int coin : coins) {
for (int i = coin; i <= amount; i++) {
dp[i] += dp[i - coin];
}
}
return dp[amount];
}
}
def change(amount, coins):
dp = [0] * (amount + 1)
dp[0] = 1
for coin in coins:
for i in range(coin, amount + 1):
dp[i] += dp[i - coin]
return dp[amount]
# Example usage
print(change(5, [1, 2, 5])) # 4
print(change(3, [2])) # 0
function change(amount, coins) {
let dp = new Array(amount + 1).fill(0);
dp[0] = 1;
for (let coin of coins) {
for (let i = coin; i <= amount; i++) {
dp[i] += dp[i - coin];
}
}
return dp[amount];
}
// Example usage
console.log(change(5, [1, 2, 5])); // 4
console.log(change(3, [2])); // 0
Explanation
- DP Insight: dp[i] = number of ways to make amount i.
- Steps: For each coin, add ways using it to all higher amounts.
- Flow Example (5,[1,2,5]): dp[5]=1 (5), +2 (2+1+1+1), +1 (1+1+1+1+1) = 4.
- Why It Works: Accumulates combinations systematically.
Note
Time complexity: O(amount*n), Space complexity: O(amount). A coin-combo extravaganza!
