Kesirli Sırt Çantası
Açgözlü Algoritmalar O(n log n) O(1)Öğeler bölünebildiğinde ağırlık sınırı altında değeri en büyükler: öğeleri değer/ağırlık sırasıyla al, sonuncuyu kesirli böl.
kapasite 50toplam0
1/13
Eşyalar değer/ağırlık oranına göre sıralandı — kilo başına en değerli önce.
DeğişmezÇanta, ağırlık birimi başına en iyi değeri tutar; burada açgözlülüğü optimal yapan, bir eşyayı bölebilmektir.
fractional-knapsack.c
/* items sorted by value/weight ratio (desc) */double fracKnapsack(int w[], int v[], int n, int W) {double total = 0;int remaining = W;for (int i = 0; i < n && remaining > 0; i++) {if (w[i] <= remaining) {remaining -= w[i]; /* take it all */total += v[i];} else {double frac = (double)remaining / w[i];total += v[i] * frac; /* take a fraction */remaining = 0;}}return total;}
Kesirli Sırt Çantası nasıl çalışır?
Önce kilogram başına en değerli. Sığdıkça öğeleri bütün al, sonra çantayı bir sonrakinin kesriyle doldur — açgözlü seçimi kanıtlanabilir optimal yapan bölünebilirliktir.
Ne zaman kullanılır?
Bölünebilir kaynaklar: sıvılar, bütçeler, bant genişliği. (Bölünemez öğeler 0/1 sırt çantası DP ister.)