题解 | #放苹果#

放苹果

https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            //题目翻译:将m分成n个数的和,求有多少种分法
            int m = in.nextInt();
            int n = in.nextInt();
            int res=func(m,n);
            System.out.println(res);
        }
    }
    public static int func(int m,int n){
        //苹果数为0,什么也不做看成是1种方案
        if(m==0){
            return 1;
        }
        if(n==0){
            return 0;
        }
        //苹果数量小于盘子数量,等价于m个苹果放到m个盘子里,比如3个苹果,5个盘子,最多按3个盘子放
        if(m<n){
            return func(m,m);
        }else{
            //每次放苹果时有两种情况:无空盘子(每个拿出一个来,不影响放法,但成功使m向边界移动)有空盘子(至少有一个空盘子,使n向边界条件移动,选择空1个是有空盘子种最多的放法)
            return func(m-n,n)+func(m,n-1);
        }
    }
}

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务