JAVA算法:M个苹果放到N个盘子中的方法(JAVA代码)
题目描述:
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
说明1:5,1,1和1,5,1 是同一种放置方法。
说明2:1<=M,N<=10。
样例数据:M=7;N=3时,有8种方法
问题分析:递归算法
分为两种状况,m为苹果数;n为盘子数
第一种情况:当苹果的数量小于盘子的数量时,即 m<n 时,问题就是转化为将 m 个苹果放到 m 个盘子中;
第二种情况:当苹果数大于盘子数量时,即 m>=n 时,要分析:
(1)将至少其中一个盘子不放,那就是 m 个苹果放到 (n-1) 个盘子中的方法
(2)每个盘子放一个,然后就是(m-n)个放在 n 个盘子的方法
算法设计
package com.bean.algorithm.basic;
public class AppleDemo {
/*
* 递归算法
* */
public int solve(int m,int n) {
if (n == 1 || m == 1 || m==0) {
return 1;
}
if (m < n) { // 苹果数量小于盘子数量
return solve(m, m);
} else {
return solve(m, n - 1) + solve(m - n, n);
}
}
public static void main(String[] args) {
AppleDemo ballandbox = new AppleDemo();
int m = 7; //7个苹果
int n = 3; //3个盘子
int result = ballandbox.solve(m, n);
System.out.println("result = " + result);
}
}
程序运行结果:
result = 8