2011-11-19 22 views

cevap

12

Bu Partition Problem olarak bilinen ve başvurulan bağlantı ayrıntılarını görebilirsiniz. vikiden :

bölüm işlevi üzerinde bir sap alma

bir yolu olarak büyük, en azından doğal sayılar kullanılarak n bölüm sayısını temsil eden bir ara işlev p (k, n), içerir k. k herhangi bir değeri, p (k, n) ile sayılmıştır bölümleri için aşağıdaki kategorilerden tam birisine girer:

smallest addend is k 
smallest addend is strictly greater than k. 

birinci durum, toplantı bölmelerin sayısı p (k, n, - k). Bunu görmek için, sayı n tüm bölümleri listesini hayal - o zaman listedeki her bölüm için "+ k" ekleme hayal boyutunda en az k sayıları içine k. Şimdi ne listesi? bir not olarak, tek bir + p (k, ikinci durum, toplantı bölme

1+ sum{k=1 to floor (1/2)n} p(k,n-k) = p(n), 

sayısı, yani, ara fonksiyon vadede bölüm fonksiyonu için yineleme ilgili bir tür tanımlamak için kullanabilir 1, n) tam k herhangi bir parça yoktur en azından k bölüme bir bölüm en azından k + 1.

iki koşul birbirini dışlayan olduğundan, bölümleri sayısı toplantısı tüm parçaları olması gerekir çünkü her iki durum da p (k + 1, n) + p (k, n - k) dir. yinelemeli tanımlanmış fonksiyon böylece:

p(k, n) = 0 if k > n 

p(k, n) = 1 if k = n 

p(k, n) = p(k+1, n) + p(k, n − k) otherwise. 

Aslında sen, memoization bütün değerlerini hesaplayabilirsiniz ekstra özyinelemeli aramaları engellemek için.

Düzenleme: unutbu onun yorumunda belirtildiği gibi çıkış sonucunu istediğinizde, sonunda sen 1'den çıktı o aslında tüm P değerleri wiki bağlantı olarak hesaplanacaktır hangi sonuç çıkarma, ama sonunda gerektiğini, 1 ile çıkarmalısınız.

+0

Ve bunu OP'nin sayma yöntemiyle ilişkilendirmek için, OP n 'nin bir n bölümü olarak sayılmadığından OP'yi 1 (n, n)' den çıkarmak zorundayız. – unutbu

+0

evet, ama nihai sonuç, yolu 1 ((n) '(veya P (wiki) Yukarıdaki ancak P' için yazdığı tüm P (i, j) hesaplanacaktır aslında, 1'den çıkarılmalıdır @unutbu n)) (sadece çıktı değeri) 1'den çıkarılmalıdır. Cevabımı düzenledim, teşekkürler. –

İlgili konular