- 题目描述:
-
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
- 输入:
-
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
- 输出:
-
对输入的每组数据M和N,用一行输出相应的K。
- 样例输入:
-
17 3
- 样例输出:
-
8 这道题真的是如果没思路就一点儿也不会。主要的思想是用递归函数,向n个篮子里放m个苹果,假如有空的,相当于往n-1个篮子里放m个苹果;假如没空的,就相当于往n个篮子里放m-n个苹果,减n的意思是 n个篮子里放了n个苹果。 代码如下:
1 #include
2 #include 3 #include 4 #include 5 #include 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 }