Hedefin dinamik programlama kullanmak olduğu bir problemle karşılaştım (diğer yaklaşımlar yerine). Uzatılacak bir mesafe ve farklı uzunluklarda bir kablo seti vardır. Mesafeyi tam olarak katlamak için gereken minimum kablo sayısı nedir?
Bana göre bu bir sırt çantası sorununa benziyordu , ancak belirli bir uzunluğun katları olabileceğinden, 0/1 sırt çantası probleminden ziyade sınırlı bir sırt çantası problemiydi. (Her öğenin değerini ağırlık olarak değerlendirin.) Saf yaklaşımı (ve arama alanının genişlemesini umursamadan), sınırlı sırt çantası problemini 0/1 sırt çantası problemine dönüştürmek için kullandığım yöntem, katları tekli parçalara ayırın ve iyi bilinen dinamik programlama algoritmasını uygulayın. Ne yazık ki, bu optimal olmayan sonuçlara yol açar.
Örneğin, verilen kablolar:
1 x 10ft,
1 x 7ft,
1 x 6ft,
5 x 3ft,
6 x 2ft,
7 x 1ft
Hedef açıklık 13ft ise, DP algoritması mesafeyi yaymak için 7 + 6'yı seçer. Açgözlü bir algoritma 10 + 3 seçebilirdi, ancak minimum sayıda kablo için bir bağ. Sorun 15ft yayılmaya çalışırken ortaya çıkar. DP algoritması 4 kablo almak için 6 + 3 + 3 + 3'ü seçerken, açgözlü algoritma sadece 3 kablo için 10 + 3 + 2'yi doğru seçiyor.
Her neyse, 0/1 ile sınırlı dönüşüm yapmak için hafif bir tarama yapmak, birden fazla öğeyi {p, 2p, 4p ...} 'ye dönüştürmek için iyi bilinen bir yaklaşım gibi görünüyor. Benim sorum, p + 2p + 4p birden fazla öğe sayısına eklenmezse bu dönüşümün nasıl çalıştığıdır. Örneğin: 5 adet 3ft kablom var. {3, 2x3, 4x3} 'i çok iyi ekleyemiyorum çünkü 3 + 2x3 + 4x3> 5x3. Bunun yerine {3, 4x3} eklemeli miyim?
[Şu anda "Oregon Trail Sırt Çantası Sorunu" belgesini bulmaya çalışıyorum, ancak şu anda kullanılan yaklaşım dinamik programlama yok gibi görünüyor.]