华为在线编程-放苹果

题目描述

把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)种放法

  1. m > n时,可以选择让一个盘子为空或者每个盘子都放上1个苹果
    F(m, n) = F(m, n-1) + F(m-n, n)

  2. m == n时,同1一样,只不过每个盘子都放苹果的话只有1种方法
    F(m, n) = F(m, n-1) + 1

  3. m < 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;
        }
    }
}

举一反三:

  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);
    
  2. 不包含重复数字的整数划分(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
    

    没有理解这个边界

  3. 只能取奇数
    与上面的类似

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值