Bölünebilir nesneleri değer/ağırlık oranına göre seçerek kapasite içinde maksimum değeri hedefler.
Fractional Knapsack, klasik çanta probleminin nesnelerin parçalanabildiği sürümüdür. Her nesne için değer/ağırlık oranı hesaplanır; en yüksek oranlı nesneler önce çantaya alınır, kapasite yetmezse son nesnenin yalnızca uygun kesri eklenir.
DAA notlarında GreedyKnapsack akışı, p[i]/w[i] oranına göre sıralanmış nesneler üzerinde çözüm vektörünü önce sıfırlayıp kapasite dolana kadar tam nesne, son adımda ise kesirli nesne seçimiyle kurar.
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.
1type Item = { name: string; value: number; weight: number; };2function fractionalKnapsack(items: Item[], capacity: number) {3 const sortedItems = [...items].sort((a, b) => b.value / b.weight - a.value / a.weight);4 let remaining = capacity, totalValue = 0;5 const selected: Array- = [];
6 for (const item of sortedItems) {7 if (remaining <= 0) break;8 const fraction = Math.min(1, remaining / item.weight);9 selected.push({ ...item, fraction });10 totalValue += item.value * fraction;11 remaining -= item.weight * fraction;12 }13 return { totalValue, selected };14}Kapasite ve nesneleri noktalı virgülle ayırın. Örnek: 50; gold:60:10, silver:100:20, bronze:120:30
Kapasite ve nesneleri noktalı virgülle ayırın. Örnek: 50; gold:60:10, silver:100:20, bronze:120:30
En İyi Durum: O(n log n)
Ortalama Durum: O(n log n)
En Kötü Durum: O(n log n)
O(n) - Çalışma süresi, giriş boyutu ile doğrusal olarak artar.
Fractional Knapsack Algoritması ile benzer veya alternatif olarak değerlendirilebilecek diğer başlıklar: