分苹果

描述

把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]);
		
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值