package MOOC;
import java.util.Scanner;
/**
放苹果:
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多种不同的分法?5,1,1和1,5,1是同一种分法。
输入样例:
7 3
输出样例:
8
* @author Vivinia
*
* 2018年2月11日
*/
public class PutApple {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int i=input.nextInt();
int k=input.nextInt();
input.close();
System.out.println(f(i,k));
}
private static int f(int i, int k) {
if(k>i)
return f(i,i); //k>i(盘子比苹果多,最少会有k-i个空盘子)时,f(i,k)=f(i,i)
if(i==0)
return 1; //苹果没有,一种放法(每个盘子放0个苹果)
if(k==0)
return 0; //盘子没有,不能放苹果
return f(i,k-1)+f(i-k,k); //k<=i(个数相等或者盘子较少)时,总放法=有盘子为空的放法+没盘子为空的放法 f(i,k)=f(i,k-1)+f(i-k,k)
}
}
1.当盘子多于苹果时,一定会有空的,最少是i-k个空盘子,所以可以转换为i个苹果在i个盘子的放法;
2.盘子少时:盘子有可能为空,则k-1相当于把一个盘子作为空盘子不用,剩下的k-1个盘子用于放苹果,递归起来,就会有中空盘子情况;盘子不为空时,相当于把苹果先在每个盘子各放一个,i-k是放过后剩下的苹果个数,再开始放这些,不会有空盘子;