當前位置:編程學習大全網 - 編程軟體 - 整數分劃問題

整數分劃問題

設二元函數 f( n , p )為滿足以下條件的分劃數:

1. p <= n1 <= n2 <= ... <= nk

2. n1 + n2 + ... + nk = n

按以下方法可以求出f( n , p )的遞推關系式:

當n1 = p 時,

應有 n2 + ... + nk = n - p ,

且 p <= n2 <= ... <= nk

有 f( n-p , p )種分劃;

當n1 = p + 1 時,

應有 n2 + ... + nk = n - p - 1 ,

且 p+1 <= n2 <= ... <= nk

有 f( n-p-1 , p+1 )種分劃;

同理

n1 = p + 2 時有 f( n-p-2 , p+2 )種分劃;

n1 = p + i 時有 f( n-p-i , p+i )種分劃;

最後,n1 = n ,有 1 種分劃。

所以 f( n , p ) = f(n-p , p) + f(n-p-1 , p+1) + ..

.. + f(n-p-i , p+i) + ... + f(1 , n-1) + 1

另外,在這個函數中,當 2*p>n 時,也就是 n1 大於 n/2 時,

顯然可以看出 f=0,因為這樣的分劃不存在。

所以上式可以化簡成

f( n , p ) = f(n-p , p) + f(n-p-1 , p+1) + ..

.. + f(n-p-i , p+i) + ... + f( [n/2] , n-[n/2]) + 1

所以妳的題目就是求f(n,1)的值

f(n,1)=f(n-1,1) + f(n-2,2) + .. + f([n/2],n-[n/2]) +1

(把[ ]當作上取整)

用遞歸實現上面說的那個函數,然後把妳指定的n和1作參數傳遞給它就OK了。

哦對了,遞歸出口是f(1,1)=1,這個由題意和函數的定義很容易得到。

ps,這個函數似乎可能應該好象可以轉化成非遞歸型的,不過我懶得繼續再想了.....對小於80的數我的機子都用不到1秒..

另外,妳的題目裏是否應該n=6時輸出11 ?

PASCAL我不會,反正這數學模型沒問題,轉化成語言應該是妳自己的事吧.

  • 上一篇:在線考試系統源碼分享
  • 下一篇:編程和打字應該很快
  • copyright 2024編程學習大全網