九度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
",ans);
35         }
36     }
37     return 0;
38 }
原文地址:https://www.cnblogs.com/jasonJie/p/5757936.html