Skip to content
ΣDSA Patterns
Menu
Language

Knapsack & Subset DP

Guide 4 of 6 · Path 4 of 6

Interactive

Mental model

A worked animation for this problem. Scrub steps or press space to pause; re-tell the invariant out loud.

Step 1 of 6
0
1
2
3
4
5

dp[0]=1 · unbounded

Coin change II: combinations (order ignored) that sum to 5 with coins {1,2,5}.

Demo preview: These solutions pass the automated test suite but have not been human-reviewed. Treat trade-offs and prose as draft.

Coin Change II

Problem (restated)

Number of combinations that make up amount with given coin denominations (order does not matter).

Intuition

Outer loop coins, inner amount ascending → combinations not permutations.

Approaches

Unbounded knapsack count

Unverified
Time O(amount · n)Space O(amount)

Idea. dp[0]=1; for coin: for a=coin..amount: dp[a]+=dp[a-coin].

Walkthrough. amount=5, coins=[1,2,5] → 4.

Trade-offs. Swap loop order → permutations (wrong for this problem).

Solution
export function change(amount: number, coins: number[]): number {
  const dp = new Array(amount + 1).fill(0);
  dp[0] = 1;
  for (const c of coins) {
    for (let a = c; a <= amount; a++) dp[a]! += dp[a - c]!;
  }
  return dp[amount]!;
}
export function change(amount: number, coins: number[]): number {
  const dp = new Array(amount + 1).fill(0);
  dp[0] = 1;
  for (const c of coins) {
    for (let a = c; a <= amount; a++) dp[a]! += dp[a - c]!;
  }
  return dp[amount]!;
}

Template connection

Knapsack unbounded combinations.

Reflection