Eşyaların sınırlı miktarlarda (Bounded), sınırsızca (Unbounded), dallanıp sınırlandırmalı veya polinomsal doğrulamaya tabi tutularak (Nondeterministic / DKP) çanta problemlerinin çözüm yollarını kapsar.
Klasik 0/1 Çanta probleminde her nesneden sadece bir adet alınabilirken, varyantlar gerçek hayattaki farklı tedarik kısıtlarını modeller.
Sınırlı Çanta (Bounded Knapsack) probleminde her eşya türünden en fazla $c_i$ adet alınabilir. Sınırsız Çanta (Unbounded Knapsack) probleminde ise her eşyadan istenildiği kadar sınırsızca alınabilir. Bu problemler Dinamik Programlama (DP) tabloları ile çözülür.
Dallanıp Sınırlandırmalı Çanta (Branch-and-bound Knapsack), DP yerine durum ağacında kesirli gevşetme sınırlarını kullanarak kesin tamsayılı çözüm üretir. Nondeterministik Çanta (DKP) ise NP-tam sınıflarını betimlemek için tasarlanmıştır: Karar versiyonunda belirli bir hedef değere ulaşılabileceğini tahmin edip polinomsal sürede doğrular.
Aşağıdaki uygulamalar PDF kaynaklarındaki pseudo kod akışını modern veri yapılarıyla ifade eder. Kenar durumları görünür bırakıldığı için örnekler doğrudan test edilebilir.
1export function unboundedKnapsack(W: number, w: number[], v: number[], n: number): number {2 const dp = new Array(W + 1).fill(0);3 4 for (let weight = 1; weight <= W; weight++) {5 for (let i = 0; i < n; i++) {6 if (w[i] <= weight) {7 dp[weight] = Math.max(dp[weight], dp[weight - w[i]] + v[i]);8 }9 }10 }11 return dp[W];12}1314export function boundedKnapsack(W: number, w: number[], v: number[], c: number[], n: number): number {15 // Convert Bounded to 0/1 Knapsack using binary decomposition16 const newW: number[] = [];17 const newV: number[] = [];18 19 for (let i = 0; i < n; i++) {20 let limit = c[i];21 let k = 1;22 while (limit > 0) {23 const take = Math.min(k, limit);24 newW.push(take * w[i]);25 newV.push(take * v[i]);26 limit -= take;27 k *= 2;28 }29 }30 31 // Standard 0/1 DP32 const m = newW.length;33 const dp = new Array(W + 1).fill(0);34 for (let i = 0; i < m; i++) {35 for (let weight = W; weight >= newW[i]; weight--) {36 dp[weight] = Math.max(dp[weight], dp[weight - newW[i]] + newV[i]);37 }38 }39 return dp[W];40}Sınırlı, Sınırsız, Branch & Bound ve Nondeterministik modlarda çanta problem çözümlerini karşılaştırın.
Sınırlı, Sınırsız, Branch & Bound ve Nondeterministik modlarda çanta problem çözümlerini karşılaştırın.
En İyi Durum: O(W * n) - Dynamic Programming
Ortalama Durum: O(W * sum(log c_i)) - Sınırlı çanta ikili ayrıştırma ile
En Kötü Durum: O(2^n) - Branch and Bound worst-case
O(W) - DP tabloları veya kuyruk yapıları için - Bu algoritmanın karmaşıklığı belirtilmemiş.
Çanta Problemi Varyantları (Knapsack Problem Variants) Algoritması ile benzer veya alternatif olarak değerlendirilebilecek diğer başlıklar: