java题目 放苹果
描述
把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
数据范围:0 \le m \le 10 \0≤m≤10 ,1 \le n \le 10 \1≤n≤10 。
本题含有多组样例输入。
输入描述:
输入两个int整数
输出描述:
输出结果,int型
示例1
输入:
7 3
输出:
8
1 /* 2 解题分析: 3 设f(m,n) 为m个苹果,n个盘子的放法数目,则先对n作讨论, 4 当n>m:必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响。即if(n>m) f(m,n) = f(m,m) 5 当n<=m:不同的放法可以分成两类: 6 1、有至少一个盘子空着,即相当于f(m,n) = f(m,n-1); 7 2、所有盘子都有苹果,相当于可以从每个盘子中拿掉一个苹果,不影响不同放法的数目,即f(m,n) = f(m-n,n). 8 而总的放苹果的放法数目等于两者的和,即 f(m,n) =f(m,n-1)+f(m-n,n) 9 递归出口条件说明: 10 当n=1时,所有苹果都必须放在一个盘子里,所以返回1; 11 当没有苹果可放时,定义为1种放法。因为: 递归的两条路,第一条n会逐渐减少,终会到达出口n==1; 第二条m会逐渐减少,因为n>m时,我们会return f(m,m) 所以终会到达出口m==0. 12 */ 13 14 import java.util.*; 15 public class Main { 16 public static void main(String[] args) { 17 Scanner scanner = new Scanner(System.in); 18 while (scanner.hasNext()){ 19 int m = scanner.nextInt(); 20 int n = scanner.nextInt(); 21 System.out.println(count(m, n)); 22 } 23 } 24 25 // 递归功能:当前持有m个苹果,有n个盘子可供存放,返回摆放方案数 26 private static int count(int m, int n) { 27 // 递归出口:当苹果数m=0, 此时表示什么都不做,输出1种方案,再递归下去m<0,题目要求m>=0 28 // 当盘子只有一个时,剩下的苹果m只能全部摆放这个盘子,递归返回1种方案,再递归下去n==0, 题目要求n>=1 29 if(m == 0 || n == 1) { 30 return 1; 31 } 32 // 当盘子数大于苹果数,一定有n-m个盘子空着,而且每个盘子都一样,因此count(m,n)==count(m,m) 33 if(n > m) { 34 return count(m, m); 35 } else { 36 // 当盘子数<=苹果数,有两种情况: 37 // 1.至少有一个盘子可以不放,因此count(m, n-1) 38 // 2.至少每个盘子都有一个苹果,摆放后苹果数为(m-n),因此coutn(m-n, n) 39 return count(m, n - 1) + count(m - n, n); 40 } 41 } 42 }