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

Knapsack ve Alt Küme DP

Rehber 3 / 6 · Yol 3 / 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
1
1
1
1
1

P − N = 3 · P+N = 5

Target sum: [1,1,1,1,1]'e ± ata ki işaretli toplam 3 olsun.

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

Target Sum

Problem (yeniden ifade)

Her nums[i]’ye + veya − ata. İşaretli toplamın target’a eşit olduğu yolları say.

Sezgi

Pozitif küme P ve negatif küme N’ye böl: P-N=target, P+N=sum ⇒ P=(sum+target)/2. P’ye toplanan alt kümeleri say.

Yaklaşımlar

Alt küme toplamı sayım indirgemesi

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

Fikir. sum+target tekse veya |target|>sum → 0. 0/1 knapsack kombinasyon sayımı.

Yürüyüş. [1,1,1,1,1], target=3 → 5 yol.

Trade-off. (i, sum) üzerinde memo’lu DFS de çalışır; knapsack O(nΣ).

Çözüm
export function findTargetSumWays(nums: number[], target: number): number {
  const total = nums.reduce((a, b) => a + b, 0);
  if (total < Math.abs(target) || (total + target) % 2 !== 0) return 0;
  const need = (total + target) / 2;
  const dp = Array(need + 1).fill(0);
  dp[0] = 1;
  for (const x of nums) {
    for (let c = need; c >= x; c--) dp[c] += dp[c - x]!;
  }
  return dp[need]!;
}
export function findTargetSumWays(nums: number[], target: number): number {
  const total = nums.reduce((a, b) => a + b, 0);
  if (total < Math.abs(target) || (total + target) % 2 !== 0) return 0;
  const need = (total + target) / 2;
  const dp = Array(need + 1).fill(0);
  dp[0] = 1;
  for (const x of nums) {
    for (let c = need; c >= x; c--) dp[c] += dp[c - x]!;
  }
  return dp[need]!;
}

Şablon bağlantısı

Alt küme toplamı / 0/1 knapsack sayımı.

Yansıma