九度oj 题目1160:放苹果
- 题目描述:
-
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
- 输入:
-
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
- 输出:
-
对输入的每组数据M和N,用一行输出相应的K。
- 样例输入:
-
1 7 3
- 样例输出:
-
8
这道题真的是如果没思路就一点儿也不会。主要的思想是用递归函数,向n个篮子里放m个苹果,假如有空的,相当于往n-1个篮子里放m个苹果;假如没空的,就相当于往n个篮子里放m-n个苹果,减n的意思是
n个篮子里放了n个苹果。
代码如下:1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 #include <iostream> 6 using namespace std; 7 8 int dp[11][11]; 9 10 int cal(int m, int n) { 11 if(m < 0 || n < 0) { 12 return 0; 13 } 14 if(n == 1) { 15 return 1; 16 } 17 if(dp[m][n] != 0) { 18 return dp[m][n]; 19 } 20 else { 21 dp[m][n] = cal(m, n-1) + cal(m-n, n); 22 return dp[m][n]; 23 } 24 } 25 26 int main(int argc, char const *argv[]) 27 { 28 int n, m, t; 29 memset(dp, 0, sizeof(dp)); 30 while(scanf("%d",&t) != EOF) { 31 while(t--) { 32 scanf("%d %d",&m, &n); 33 int ans = cal(m, n); 34 printf("%d\n",ans); 35 } 36 } 37 return 0; 38 }