Erin買了不少雞蛋,她發現一天吃不完這麼多,於是決定把n個同樣的雞蛋放在m個同樣的籃子裡,允許有的籃子空著不放,請問共有多少種不同的放法呢?
注意:2,1,1和1,2,1 是同一種分法。
Input第一行是測試數據的數目t(0 <= t <= 20)。以下每行均包含二個整數m和n,以空格分開。1<=m,n<=10。
Output對輸入的每組數據m和n,用一行輸出相應的結果。
例如:
Input:
4
3 8
4 7
2 4
4 2
Output:
10
11
3
2
(注意結尾有換行)
嘗試利用遞歸去分析解題,即不同情況下應該怎麼返回。
可以嘗試用樹狀圖(然而我覺得用處不大)。
注意籃子可以空著不放,請先想明白示例中最後兩個例子再做題。
我的代碼:
#include<stdio.h> int egg(int m, int n); int main() { int t, m, n, i, result = 0; scanf("%d", &t); for (i = 0; i < t; i++) { scanf("%d%d", &m, &n); result = egg(m, n); printf("%d\n", result); } return 0; } int egg(int m, int n) { if (m == 1 || n == 1) { return 1; } if (n <= m) { return 1 + egg(n-1, n); } else { return egg(m-1, n) + egg(m, n-m); } }
標答:
#include<stdio.h> int egg(int m, int n); int main() { int t; // m for baskets, n for eggs int m, n; int result = 0; scanf("%d", &t); while (t--) { scanf("%d %d", &m, &n); result = egg(m , n); printf("%d\n", result); } return 0; } int egg(int m, int n) { if (m == 1 || n == 0) return 1; if (n < 0) return 0; return egg(m-1, n) + egg(m, n-m); }