题目描述:
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入
每个用例包含二个整数M和N。0<=m<=10,1<=n<=10。
样例输入
7 3
样例输出
8
思路方法(参考网上的思路):通过递归来实现。设m个苹果n个盘子有F(m,n)种放法
m > n时,可以选择让一个盘子为空或者每个盘子都放上1个苹果
F(m, n) = F(m, n-1) + F(m-n, n)m == n时,同1一样,只不过每个盘子都放苹果的话只有1种方法
F(m, n) = F(m, n-1) + 1m < n时,必定有盘子要为空,因此只需要考虑怎么在其中的m个盘子上放m个苹果即可
F(m, n) = F(m, m)
递归的出口:当m==1或者n==1时,只有1种方法
代码:
import java.util.Scanner;
/**
* Created by hmh on 2017/4/3.
*/
public class PutAppleOnDisk {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
int m=sc.nextInt();
int n=sc.nextInt();
System.out.println(F(m,n));
}
}
public static int F(int x,int y){
if(x==1||y==1){
return 1;
}else if(x<y){
return F(x,x);
}else if(x > y){
return F(x,y-1)+F(x-y,y);
}else{
return F(x,y-1) + 1;
}
}
}
举一反三:
整数划分
n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,...,mi}为n的一个划分。 如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi)<=m,则称它属于n的一个m划分。这里我们记n的m划分的个数为f(n,m); 与放苹果类似f(n,m)n为要划分的数 m为划分时包含的最大的数 (1)n==1要划分的数为1,只有一种划分,m==1时划分中包含的最大数是1, 毫无疑问只能为有一种划分 (2)n<m即要划分的数小于划分中要包含的最大数,这种情况与f(n,n)一致; (3)n==m这时划分时可以让最大划分数位n,也可以比n小,当最大划分数为n(m==n)时f(n,m)只有一种划分方法; 故 f(n,m)=1+f(n,m-1); (4)n>m时同(3)的分析划分中可以包含最大划分数m也可以比m小包含m时为f(n-m,m)比m小时为f(n,m-1);
不包含重复数字的整数划分(1到m的每个数最多被使用1次)
转移公式变为:F(n ,m) = F(n-m ,m-1)+F(n, m-1) 如果这次取了m则下次只能从m-1开始取,如果不取m则下次也是从m-1取 结束条件变为:当m=1时,f(n,m)=1;当n=1而m>1时,f(n,m)=0
(没有理解这个边界)
只能取奇数
与上面的类似