2016-03-27 8 views
3

N aynı topları M farklı kutuya yerleştirme ve tüm bileşimleri yazdırma ile ilgili klasik sorun hakkında: Tüm sorunları yazdırmak için sorunu genişletmek isterseniz ne olur? 0< M, N biz ilk birkaç m çıkışını incelemek Şimdi eğerDinamik Programlama Kullanarak Birden Fazla Değer Üzerinde Kovanlarda Kaç Topun Hesaplanması

for (int i =0; i<M; i++) 
{ 
    for (int j =0; j <N; j++) 
    { 
     PrintAllCombinations(j,i) 
    } 
} 

ve n, her önceki yineleme çıktısı sonraki bir alt kümesi olduğunu görüyoruz: kaba kuvvet yöntemi böyle bir şey yapılabilir. Bana öyle geliyor ki, bu fenomeni kullanmak için dinamik bir algoritma uygulayabiliriz. Ancak, biz yine de örneğin n=3 = 3 +0, 2+1, 1+2 için, her n bölme gerekir. Hala gereksiz kombinasyon hesaplamalarını yapmak zorundayız.
Herhangi bir fikir köknar geliştirmeleri?

+0

yinelemeli bir yöntem kullanınız. Kodunuz sadece iki seviye için çalışacaktır (i, j) ve değil (i, j, k.l, ....). – jdweng

+0

Ödev dökümü veya gerçek soru olup olmadığından emin değil. – Guy

cevap

1

S[i][j]j kutularına i toplar için kombinasyon sayısıdır. Sadece kombine beri bütün j için

S[0][j] = 1 boş bütün bidonları sahip olmaktır. Herkes için

S[i][1] = 1 tek kombinasyon tek tenekesine tüm topları koymaktır i beri. her i için

j S[i][j] = sum(x = 0 -> i, S[i-x][j-1]). Yani her pozisyonda son bin topları mümkün olan her sayıda atayarak kombinasyon sayısını hesaplamak ve almak kombinasyonların sayısını özetleyebilirim içindir.

Kombinasyonları yazdırmak isterseniz, sayımı gerçek kombinasyonlarla değiştirebilir ve toplamda iç kombinasyonları aldığınızda x değerini ekleyebilirsiniz. Bu hızda çok fazla kazanç olmadan çok fazla bellek alacaktır. Sadece yinelemeyi yapın ve yine de çözüm sayısına bağlı olduğunuzdan hesaplamayı tekrarlayın.

İlgili konular