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!
            
        