算法刷题-放苹果-JAVA

0x00 引言

为获取一个良好的算法思维,以及不再成为一个脚本小子,争取每天一道算法题,培养自己的逻辑思维,温顾各类型语言语法知识。

题解只写自己理解的解法,其他解法不再增加。题目与解析均在代码里面。

0x01 难度等级

简单

0x02 代码

package 简单;

import java.util.Scanner;

/*

采用递归的思想将此事件无限细分,
每个事件可以分为f(m,n)=f(m-n,n)+f(m,n-1);
f(m-n,n)是当苹果数大于等于盘子数的情况,m个苹果,n个盘子,m>n时,每个盘子都能分到至少一个苹果,所以只需要考虑把剩下的m-n个苹果分给n个盘子的问题
f(m,n-1)是当苹果数小于盘子数的情况。苹果数小于盘子,至少是有一个盘子没有苹果,所以是把m个苹果分给n-1个盘子

当此事件分到苹果数为0或苹果数为1或盘子数为1的时候返回1,
当苹果数小于0或盘子数小于等于0返回0.

描述
把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
注意:如果有7个苹果和3个盘子,(5,1,1)和(1,5,1)被视为是同一种分法。

数据范围:
0≤m≤10 ,

1≤n≤10 。

示例1
输入:
7 3

输出:
8
*
*
*
* */
public class 放苹果 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int m=sc.nextInt();
        int n=sc.nextInt();
        System.out.println(count(m,n));
    }
    public static int count(int m,int n)
    {
        if(m<0||n<=0)
            return 0;
        //细分到苹果数为一或盘子数为一的情况返回一
        if(n==1||m==0)//0≤m≤10 ,1≤n≤10
            return 1;
        //将此事件无线细分
        return count(m,n-1)+count(m-n,n);
    }
}

0x03 算法思想

考查递归的思想:
每个事件可以分为f(m,n)=f(m-n,n)+f(m,n-1); f(m-n,n)是当苹果数大于等于盘子数的情况,m个苹果,n个盘子,m>n时,每个盘子都能分到至少一个苹果,所以只需要考虑把剩下的m-n个苹果分给n个盘子的问题 f(m,n-1)是当苹果数小于盘子数的情况。苹果数小于盘子,至少是有一个盘子没有苹果,所以是把m个苹果分给n-1个盘子。主要是以下的临界值作为判断:
        if(n==1||m==0)//0≤m≤10 ,1≤n≤10
            return 1;

0x04 运行结果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章