題目:把M個同樣的蘋果放在N個同樣的盤子裡, 允許有的盤子空著不放, 問共有多少種不同的分法?(用K表示)5, 1, 1和1, 5, 1 是同一種分法。
輸入:第一行是測試資料的數目t(0 <= t <= 20)。 以下每行均包含二個整數M和N, 以空格分開。 1<=M, N<=10。
輸出:對輸入的每組資料M和N, 用一行輸出相應的K。
程式:
#include
int apple(int m,int n)
{
if(m == 0 || n == 1)
return 1;
else if(n > m)
return apple(m, m);
else
return apple(m - n, n) + apple(m, n - 1);
}
int main(void)
{
int t, m, n;
scanf("%d", &t);
while(t--) {
scanf("%d%d", &m, &n);
printf("%d ", apple(m, n));
}
return 0;
}
此問題的解決需要嚴密的邏輯推理能力。 現分析如下:
m個蘋果放在n個盤子中, 那麼定義函數為apple(m,n):
m=0。 沒有蘋果, So 僅有一種放法。 apple(0,n)=1。
n=1。 只有一個盤子, So僅有一種放法。 apple(m,1)=1。
n>m。 因為盤子太多, 即使每個盤子裡只放一個蘋果也用不完所有的盤子, So apple(m,n)=apple(m,m)。
n<=m。 這種情況又需要分類討論。 有兩種情況。
學習C++加群753647735