Çözüm
Çözüm iki bölümden oluşmaktadır. Önce minimal seti keşfettik, sonra güç toplamını temsil edebileceğini ispatladık. Çözüm programlama uygulaması için ayarlandı.
Minimal küme algoritması
Maksimal elemanının Bul toplamı (çoklu) kümesinden. P , potansiyel minimum (çoklu) set başlangıçta boştur.birmP
Sadece bir grup, temsil olmadığı sürece kadar ekleyin toplamları bir çift olarak mümkün olan tüm yollarla bir m , S i j = { ( a i , bir j ) | a i + a j = a m }birmbirmSben j= { ( aben, birj) |birben+ aj= am}
Toplamlar kümesindeki tüm öğelerin dahil edildiğini kontrol edin.
Maksimal elemanı Bul tüm S ı j aşağıdaki özelliği ile (birlikte anlam): her biri için S ı j , bir s ya olduğu S i j , ya da bulabilirsiniz bir p böylece toplamlarının kümesinden bir p + bir s olan S i j .birsSben jSben jbirsSben jbirpbirp+ asSben j
Bu durumda ise, içermeyen bir s , sadece toplam bir s + bir p , kaldırma bir p + a s gelen S i j (veya sadece göz ardı bir işareti ayarlanır) ve ekleme , bir p ve a s olarak S i j yerine.Sben jbirsbirs+ apbirp+ asSben japasSij
Eğer her bir element varsa, onu tüm S i j'den bir kez çıkarın (ya da yok saymak için bir işaret koyun ve daha fazla dokunmamaya dikkat edin) ve onu potansiyel olarak ayarlanmış en az ayarlanmış P elementlerinin listesine ekleyin .SijSijP
Tüm boşalana kadar tekrarlayın.Sij
kısmı boş kalırsa ve devam edemezsek , tüm S i j'nin maksimum değeri ile tekrar deneyin .SijSij
Özyinelemeli adımları silmeden yeniden yaratın ve üzerinden güç ayar kapsama algoritmasına devam edin . (Bundan önce, P'nin iki öğenin toplamı olarak temsil edilemeyen tüm öğeleri içerdiğinden emin olarak kesin olarak ayarlanmış olmaları gerektiği için güvenli bir kontrol yapabilirsiniz. Örneğin, minimum öğe P'de olmalıdır .)PPP
(10. Algoritmanın amacı olan minimal bir set çözümünün aynı sayının birden fazla tekrarını içeremediğini gözlemleyin.)
Örnek:
{2,3,5,7,8,10,12,13,15}
Toplamı, iki kümenin toplam sayısından iki sayının toplamı olarak tüm olası şekillerde temsil eder.
(13,2),(12,3),(10,5),(8,7)
Tüm gruplarda bulunan veya toplam olarak gösterilebilecek maksimum sayıyı bulmaya çalışın. Belli ki 8'den aramaya başlayabiliriz, bunun üzerinde bir nokta yok.
Birinci gruptan 13, 13 = 8 + 5'tir, yani 13 iyidir, fakat ikinci gruptan 12'si iyi değildir çünkü toplamlarda 12 = 8 + 4 yapacak 4 yoktur. Daha sonra 7 ile deniyoruz. Fakat hemen 13'ü kaplayamıyoruz, 6 yok.
Daha sonra 5. deneyin. 13 = 5 + 8, 12 = 5 + 7, 10 = 5 + 5 ve sonuncusu için 8 = 5 + 3 veya 7 = 5 + 2 ama ikisi için değil. Gruplar şimdi:
((5,8),2),((5,7),3),((5,5),5),((5,3),7)
5 tüm gruplarda tekrar ediyor, bu yüzden . Her gruptan sadece bir kez 5 çıkartıyoruz.P={5}
(8,2),(7,3),(5,5),(3,7)
Açıkçası, 5'ten daha yükseğe çıkmanın bir anlamı olmadığı için tekrar 5'i deniyoruz. 8 = 5 + 3, 7 = 5 + 2, yani her şey yolunda
((5,3),2),((5,2),3),(5,5),(3,(5,2))
Yinelediği için tüm gruplardan bir 5'i tekrar alın. (Bu yaygın değil, ancak durumumuz kasıtlı olarak, tekrarlarımız olması durumunda ne yapacağımızı göstermek için yaratılmıştır.) P={5,5}
(3,2),(2,3),(5),(3,2)
Şimdi 3'ü denedik ve 5 = 3 + 2'ye sahibiz. Gruba ekle.
(3,2),(2,3),(3,2),(3,2)
Şimdi 3 ve 2'yi çıkarın çünkü her yerde tekrar ediyorlar ve biz iyiyiz ve gruplar boş.P= { 5 , 5 , 3 , 2 }
( ) , ( ) , ( ) , ( )
Şimdi, bu basitçe yapmak demektir, kaldırma olmadan özyinelemeli adımları yeniden oluşturmanız gerekir gerçekten öğeler çıkarmadan yukarıda sadece onları yerleştirerek P ve artık bunu değiştirmek için değil işaretleme.Sben jP
( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7
( 13 , 2 ) , ( 12 , 3 ) , ( 10 , 5 ) , ( 8 , 7 )
( ( 5 , ( 5 , 3 ) ) , 2 ) , (( ( 5 , ( 5 , 2 ) ) , 3 ) , ( ( 5 , ( 3 , 2 ) ) , 5 ) , ( ( 5 , 3 ) , ( 5 , 2 ) )( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7 )
( ( 5 , ( 5 , 3 ) ) , 2 ) , (( ( 5 , ( 5 , 2 ) ) , 3 ) , ( ( 5 , ( 3 , 2 ) ) , 5 ) , ( ( 5 , 3 ) , ( 5 , 2 ) )
Güç seti kapsama
Bu bölümün amacı, bulunan minimum setin güç toplamı setini kapatabildiğini kontrol etmektir. Bulunan bir çözümün verilen tüm toplamları kapsayabileceği, ancak bunların güç seti toplamları olmadığı mümkündür. (Teknik olarak, sadece bulunan minimum kümeden bir güç toplamı kümesi oluşturabilir ve güç toplamının belirttiği gibi her toplamın başlangıç toplamı kümesinde olup olmadığını kontrol edebilirsiniz. Bu, zaten sahip olduklarımızla birleştirilenlerin hepsidir, yani hiçbir şey boşa harcanmaz Özyinelemeyi geri alırken bu bölümü yapabilirsiniz.)
- Minimal kümedeki tüm elemanları 2 ardışık güç kullanarak kodlayın. Sipariş önemli değil. Aynı öğeyi, tekrar ettiği sayıda, yeni bir değerle kodlayın. C = 1'den başlayın, sonraki her eleman C = 2C'ye sahip.
( 2 = [ 1 ] , 3 = [ 2 ] , 5 = [ 4 ] , 5 = [ 8 ] )
- Geri yüklenen özyineleme listesindeki öğeleri değiştirin,
( ( 5 , ( 5 , 3 ) ) , 2 ) , (( ( 5 , ( 5 , 2 ) ) , 3 ) , ( ( 5 , ( 3 , 2 ) ) , 5 ) , ( ( 5 , 3 ) , ( 5 , 2 ) )
kodlamada: 2 ile 1, 3 ile 2, 5 ile 4 ve bir de 5 ile 8.
( ( 4 , ( 8 , 2 ) ) , 1 ) , ( ( 4 , ( 8 , 1 ) ) , 2 ) , ( ( 4 , ( 2 , 1 ) ) , 8 ) , ( ( 8 , 2 ) , ( 4 , 1 ) )
- Şu anda sahip olduğumuz tüm ara toplamları toplayın (1,2,4,8)
( ( 4 , ( 10 ) ) , 1 ) , ( ( 4 , ( 9 ) ) , 2 ) , ( ( 4 , ( 3 ) ) , 8 ) , ( ( 10 ) , ( 5 ) )
Ara toplamlar ( 1 , 2 , 3 , 4 , 5 , 8 , 9 , 10 )
( ( 14 ) , 1 ) , ( ( 13 ) , 2 ) , ( ( 7 ) , 8 ) , ( 15 )
Ara toplamlar ( 1 , 2 , 3 , 4 , 5 , 8 , 9 , 10 , 13 , 14 , 15 )
{ ( 15 ) , ( 15 ) , ( 15 ) , ( 15 ) }
2m- 1mm = 4
eksik sayıları topla12m- 1
( 6 , 7 , 11 , 12 )
- Yokluğunu aşağıdaki şekilde belirtin: her sayıyı ikili biçimde temsil edin
( 6 = 01102)
( 7 = 0111)2)
( 11 = 10112)
( 12 = 1010)2)
601102( 2 = [ 1 ] , 3 = [ 2 ] , 5 = [ 4 ] , 5 = [ 8 ] ){ 2 , 3 , 5 , 7 , 8 , 10 , 12 , 13 , 15 }, yani her şey yolunda.
701112( 2 = [ 1 ] , 3 = [ 2 ] , 5 = [ 4 ] , 5 = [ 8 ] )
1112 , 3 + 5 ve 8 ise listede.
Herhangi bir ikili gösterimi bulunamayan toplamaya karşılık gelirse, çözüm olmadığını bildiriniz.
( 2 , 3 , 5 , 5 )
Tartışma
Toplamların, ikili genişlemede gizlenmiş olan güç setinin tamamlanıp tamamlanmadığını kontrol eden algoritmayı sağlamak gerekiyordu. Örneğin, ilk örneği 8 ve 7'yi hariç tutarsak, ilk bölüm yine de çözümü sunar, yalnızca ikinci bölüm eksik toplamlar kombinasyonunu bildirir.
m , n l O g( m )m günlüğü2( m )mngünlük( m ) , ikili bir arama.
mgünlükmm günlüğü2( m ) .
m günlüğü3( m )
Algoritmanın bazı kısımları, toplam çiftini lineer zamanda bulabileceğimizi varsaymaktadır ve bu da sıralama gerektirmektedir.
Yanlış başlangıç
2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 152 , 3 , 4 , 6Sben j . Bu yüzden başarısızlık durumunda oradan başlamayı önerdik.
Başka bir örnek, 5'ten algoritmayı kaçırır ve başlatırsanız, elde edersiniz.5 , 4 , 3 , 3 ancak bu 2 içermez.
2 , 2 , 3 , 4 , 42 , 3 , 4 , 6 . Bu sürümleri kapsayan özel kurallar vardır.
Bu algoritmanın amacı, hepsini doğru bir şekilde başlattıktan sonra bir çözüm sunmaktır.
İyileştirmeler
4. Adım, bu şekilde yükseltilebilecek olandır: maksimal yerine, her koşulu, verilen koşulu sağlayan azalan düzende deneyebiliriz. Her biri için ayrı bir şube oluşturuyoruz. Bazı dallar bir çözüm vermezse, iptal edin.
2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 157 , 6 , 5 , 4hepsi ilk testten geçtiklerinden beri ayrı şekillerde. (2 veya 3'ü kullanmak için hiçbir neden yoktur, çünkü bunların altında yatan grupta olmaları gerektiğini biliyoruz.) Ve sonuna kadar ulaşabilecek tüm sürümleri toplayana kadar bu şekilde devam edin. Bu, birden fazla altta yatan seti keşfedebilecek tam kapsamlı bir çözüm yaratacaktır.
Başka bir şey, eğer durum minimumsa birden fazla tekrar yapamayacağımızı bildiğimiz için bunu algoritmamıza dahil edebiliriz.
Genel olarak, 4. adımdaki koşul, her grupta bir sayının tekrarlanması veya toplam yaratma kabiliyetine sahip olmamız şartı, bizi doğrudan üssel sulardan kurtaracak kadar güçlüdür; bu, her kombinasyonu denemek ve gücü oluşturmak için bir algoritma olacaktır Bir eşleşme bulana kadar her birini ayarladık.