• 华为OJ之放苹果


    题目描述:

    把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
    输入
    每个用例包含二个整数M和N。0<=m<=10,1<=n<=10。<=n<=10<=m<=10
    样例输入
    7 3
    样例输出
    8

    题目分析:

    本题实际上是一个划分问题,借助于递归这个强大的工具,我们可以比较容易地进行解决,具体分析思路如下:

    1,我们用f(m, n)来表示m个苹果,n个篮子的情况;

    2,出口条件:当m <= 1时f(m, n) = 1, 当n = 1时f(m, n) = 1; 

    3,当n > m时,无论怎么放置,总会有(n - m)个篮子为空,那么去掉这些篮子也不会对总的放置种类有什么影响,即f(m, n) = f(m, m);

       当 n <= m时,又分为两种情况:

       3-1,所有的篮子都不会为空,此时相当于每个篮子都至少会有一个苹果,那么去掉这些苹果,总的放置种类也不会改变,即即f(m, n) = f(m - n, n);

       3-2,至少有一个篮子不会为空,那么去掉这个篮子,总的放置种类也不会改变,即即f(m, n) = f(m, m - 1);

         那么总的放置种类数相加即可。

    4,根据3中的分析,递归过程中f(m, n)参数1和参数2都会不断减小,一定会到达出口条件,符合递归的条件。

    代码(Java实现):

     1 import java.util.Scanner;
     2 
     3 public class layApple {
     4     public static void main(String[] args) {
     5         int[] paras = getInput();
     6         System.out.println(findNumsOfLaying(paras[0], paras[1]));
     7     }
     8     public static int[] getInput() {
     9         @SuppressWarnings("resource")
    10         Scanner reader = new Scanner(System.in);
    11         int[] paras = new int[2];
    12         paras[0] = reader.nextInt();
    13         paras[1] = reader.nextInt();
    14         return paras;
    15     }
    16     
    17     public static int findNumsOfLaying(int m, int n) {
    18         if (m == 0 || n == 1) {
    19             return 1;
    20         }
    21         if (n > m) {
    22             return findNumsOfLaying(m, m);
    23         } else {
    24             return findNumsOfLaying(m - n, n) + findNumsOfLaying(m, n - 1);
    25         }
    26     }
    27 }
  • 相关阅读:
    MySQL 初识别语句,数据库、表、行的增删改查
    mysql如何从全备文件中恢复单个库或者单个表
    Shell 同步时间脚本
    app手机端连接tomcat电脑端服务器
    大于号转义符&gt;---小于号转义符&lt;
    轻松实现页面提交中
    重复提交问题(一)
    json
    ExtJs 6.0+快速入门,ext-bootstrap.js文件的分析,各版本API下载(一)
    ExtJS 6 如何引入Dashboard模版
  • 原文地址:https://www.cnblogs.com/yonguo123/p/6706793.html
Copyright © 2020-2023  润新知