1. 程式人生 > >求表示方法(整數劃分問題)

求表示方法(整數劃分問題)

設 m、n 均為自然數,m 可表示為一些不超過 n 的自然數之和,f(m,n) 為這種表示方式的數目。

例如,f(5,3)=5,有5種表示方法:3+2,3+1+1,2+2+1,2+1+1+1,1+1+1+1+1。

請編寫程式,計算f(m,n)的值。

輸入:
          m n

輸出:
          f(m,n)的值

測試輸入關於“測試輸入”的幫助 期待的輸出關於“期待的輸出”的幫助 時間限制關於“時間限制”的幫助 記憶體限制關於“記憶體限制”的幫助 額外程序關於“{$a} 個額外程序”的幫助
【分析】 說明一下: 第一種情況,這裡寫成m<=1或者n <=1,其實只有存在m=1或者n=1,那麼只有一種表示方法,例如(1,3)只能表示成1=1,或者(3,1)之能表示3=1+1+1,即f(1,n)=1或者f(m,1)=1; 第二種情況,如果m <= n,例如(3,5),那麼只能表示出3=3(1中表示方法),和(3,2),即f(m,n) =  1 + f(m, m-1); 第三種情況,其他,(m, n)的表示方法的個數等於,最大數至少包括一個n的,和最大數不包括n的。即,f(m,n) = f(m-n, n)+f(m,n-1)。 【程式碼】
#include "stdio.h"

int IntegetrDivision( int m, int n);

int main( )
{
    int m, n;
    scanf("%d %d", &m, &n);
    getchar();
    printf("%d\n", IntegetrDivision(m, n));
    return 0;
}

int IntegetrDivision(int m, int n)
{
    if(n <= 1 || m <= 1)
        return 1;
    else if(m <= n)
    {
        return IntegetrDivision(m, m-1) + 1;
    }
    else
    {
        return IntegetrDivision(m - n, n) + IntegetrDivision(m, n-1);
    }
}