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;
}