POJ 1664 放蘋果

POJ 1664 放蘋果

Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u

Description

把M個同樣的蘋果放在N個同樣的盤子裏,允許有的盤子空着不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。

Input

第一行是測試數據的數目t(0 <= t <= 20)。以下每行均包含二個整數M和N,以空格分開。1<=M,N<=10。

Output

對輸入的每組數據M和N,用一行輸出相應的K。

Sample Input

1
7 3

Sample Output

8

 

 

解題分析:

設f(m,n)爲m個蘋果,n個盤子的不同放法的數目,先對n進行分析:

1、當n〉m時,由於多餘的盤子沒用,故可將多餘的盤子去了,即f(m,n)=f(m,m)。

2、當n<=m,分兩種情況:1.至少有一個盤子是空的,則f(m,n)=f(m,n-1);2.所有的盤子都是滿的,由題意知5,1,1和1,5,1 是同一種分法。因此,從每一個盤子裏面拿出一個不影響其放的數目,則此種情況下f(m,n)=f(m-n,n),則在n〈=m的情況下,總的數目f(m,n)=f(m,n-1)+f(m-n,n);

遞歸出口的說明:

當蘋果沒有的時候,即m=0的時候,定義爲一種情況。當n=1時,所有的蘋果都得放在同一個籃子裏,因此也只有一種情況。

在遞歸的過程中,第一種情況,n的值在減少,因此最終會減到n=1時,在第一二種情況下,m的值在減少,最終m=0;

在整個遞歸的過程中,要考慮的情況只有兩種,一種是m和n的大小比較,另一種就是整個的遞歸出口。

<pre name="code" class="cpp">#include <stdio.h>
int s(int m,int n)
{
       if(m==0||n==1)
       return1;
       if(n>m)
       returns(m,m);
       else
       returns(m,n-1)+s(m-n,n);
}
int main()
{
       intt,x,m,n;
       scanf("%d",&t);
while(t--)
       {
              scanf("%d%d",&m,&n);
              x=s(m,n);
              printf("%d\n",x);
       }
      
       return0;
}




       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章