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

Knapsack ve Alt Küme DP

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

target = sum/2 = 11

[1,5,11,5]'i böl. Toplam=22, çift, sor: alt küme toplamı 11 erişilebilir mi?

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

Partition Equal Subset Sum

Problem (yeniden ifade)

Dizi eşit toplamlı iki alt kümeye bölünebilir mi?

Sezgi

Toplam tekse imkânsız; değilse 0/1 knapsack bool DP ile total/2’ye subset sum.

Yaklaşımlar

0/1 subset sum DP

Doğrulanmadı
Zaman O(n*sum)Alan O(sum)

Fikir. Kapasiteyi aşağı tarayarak dp[c] |= dp[c-x].

Yürüyüş. [1,5,11,5] → true (11 vs 1+5+5).

Trade-off. Toplamda sözde-polinom.

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

Şablon bağlantısı

Knapsack subset DP.

Yansıma