描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
(注意:假如有3个盘子7个苹果,5,1,1和1,5,1 是同一种分法。)
输入
t,表示测试组数(t<=10) 然后t行,每行包含两个数M,N.(1<=M,N<=10)
输出
输出不同的分法
样例输入
1
7 3
样例输出
8
今天主要是说一下分苹果这道题,当然有网上很多地方说的很清楚了例如:http://www.cnblogs.com/wxgblogs/p/5742618.html
我说一下我理解的别人的想法。
咱们先分析一下如果7个往三个盘子里放是什么情况:
一个盘子的情况:
如果1个苹果往一个盘子里放,那么只有1种方法。
如果两个盘子往一个盘子里放,那么有只有1种方法。
:
都是一种
两个盘子的情况:
如果是一个苹果往两个盘子里放,只有一种方法
如果是两个苹果往两个盘子里放,等于两个往一个盘子里放,和两个苹果放满两个盘子的情况。
如果是三个苹果往两个盘子里放,等于三个苹果往一个盘子里放,和三个苹果有两个铺满盘子,加上1个苹果往两个盘子里放的情况。
如果是四个苹果往两个盘子里放,等于4个苹果往一个盘子里放,和四个苹果有两个铺满盘子,加上两个苹果网两个盘子里放的结果。
三个盘子:(光举例往有四个苹果的时候)
如果是四个苹果往三个苹果里放,就等于4个苹果往两个盘子放,和4个苹果有三个铺满盘子的情况,加上1个苹果往三个盘子里放的情况。
上面有提到铺满盘子的情况,这是什么情况。1个盘子铺满一个盘子的种类只有一种,两个盘子铺满底部的种类也只有一种,三个的同理。
接下来画一张表:
第一行:就是铺满底部时有多少种方法:
第二列,就是1、2、3、4、5、6、7往一个盘子里的情况。
然后表画完,咱就要考虑一下蓝色地方的部分,蓝色地方表示的是它根本铺不满底部盘子的情况。
贴一下代码:
static Scanner scan=new Scanner(System.in);
public static void main(String[] args){
start();
}
public static void start(){
int m=scan.nextInt();
int n=scan.nextInt();
int[][] mat=new int[m+1][n+1];
for(int i = 0; i <=m; i++) {
mat[i][0]=0;
mat[i][1]=1;
}
for(int i = 0; i <=n; i++) {
mat[0][i]=1;
}
for (int i = 1; i <=m; i++) {
for(int j = 1; j <=n; j++) {
if(i<j)
mat[i][j]=mat[i][i];
else
mat[i][j]=mat[i][j-1]+mat[i-j][j];
}
}
System.out.println(mat[m][n]);
}