İçeriğe atla
ΣDSA Patterns
Menü
Dil

Knapsack ve Alt Küme DP

Rehber 4 / 6 · Yol 4 / 6

Etkileşimli

Zihinsel model

Bu problem için animasyonlu çözüm. Adımları kaydır veya boşlukla duraklat; değişmezi yüksek sesle yeniden anlat.

Adım 1 / 6
0
1
2
3
4
5

dp[0]=1 · unbounded

Coin change II: {1,2,5} paralarıyla toplamı 5 olan kombinasyonlar (sıra yok sayılır).

Demo önizleme: Bu çözümler otomatik test paketini geçiyor ama insan tarafından incelenmedi. Trade-off ve yazıları taslak olarak değerlendirin.

Coin Change II

Problem (yeniden ifade)

Verilen para birimleriyle amount’u oluşturan kombinasyon sayısı (sıra önemli değil).

Sezgi

Dış döngü paralar, iç miktar artan → permütasyon değil kombinasyon.

Yaklaşımlar

Sınırsız knapsack sayımı

Doğrulanmadı
Zaman O(amount · n)Alan O(amount)

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

Yürüyüş. amount=5, coins=[1,2,5] → 4.

Trade-off. Döngü sırasını değiştir → permütasyonlar (bu problem için yanlış).

Çözüm
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]!;
}

Şablon bağlantısı

Sınırsız knapsack kombinasyonları.

Yansıma