算法刷题-放苹果-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;