题目描述:

输入m,n,分别表示苹果数与盘子的总数,要求输出苹果放在n个盘子的方法总数(注意511和151是一种情况),例如输入 7 3 输出8((7),(6,1),(5,2),(4,3),(5,1,1),(4,2,1),(3,3,1),(3,2,2))

思路:

最典型的解法整数分解,例如给定n个苹果,把苹果放到k个盘子里,允许有的盘子为空,不妨设 f(n , k ) (边缘条件为当 n = 0 ,1时,返回1,当 k = 1 时,返回1)表示结果,分析一下可以知道有两种放的方法,一种是有空盘,一种是没空盘。

没空盘的情况可以知道每个盘子里至少有一个苹果,也就是说这种情况的总数为 f ( n-k , k ) 。

而有空盘的情况,我们可以假设最后一个盘子为空,则这种情况的总数为f ( n , k-1 ) (无需考虑多个盘子为空的情况,递归时必然会出现)

所以状态转移方程为 f ( n , k ) = f ( n-k , k ) + f ( n , k-1 )

 1 import java.util.Scanner;
 2
 3 /**
 4  * 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,
 5  * 问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
 6  */
 7 public class PlayApples {
 8
 9     public static void main(String[] args) {
10         //输入读取参数
11         Scanner cin = new Scanner(System.in) ;
12         int apples = cin.nextInt() ;
13         int planes = cin.nextInt() ;
14         cin.close();
15
16         System.out.println(count(apples,planes)) ;
17
18     }
19
20     /**
21      * 最典型的整数分解
22      * 例如给定n个苹果,把苹果放到k个盘子里,允许有的盘子为空, 不妨设 f(m , n )
23      * (边缘条件为当 m == 0 ,1时,返回1,当 n == 1 时,返回1)表示结果,
24      * 分析一下可以知道有两中放的方法,一种是有空盘,一种是没空盘,
25      * 没空盘的情况可以知道每个盘子里至少有一个苹果,也就是说这种情况的总数为 f ( n-k , k ) 。
26      * 而有空盘的情况,我们可以假设最后一个盘子为空,则这种情况的总数为f ( n , k-1 ) (无需考虑多个盘子为空的情况,递归时必然会出现)
27      * 所以状态转移方程为 f ( n , k ) = f  ( n-k , k ) +  f ( n , k-1 )。
28      *
29      * 而如果是不允许有空盘子的情况,则可以由上面的情况推出,
30      * 设 d ( n , k ) 表示把n个苹果放到k个盘子里,不允许有空盘子的方法总数,
31      * 则有f ( n , k ) =  Σ (  1 <= i <= k ) d ( n , i )
32      * 所以 d ( n , k ) = f ( n , k ) - f ( n , k-1 )
33      *
34      * @param m  苹果数量
35      * @param n  盘子数量
36      * @return
37      */
38     private static int count(int m, int n) {
39         //n为0 是错误的,故返回0
40         if(n == 0){
41             return 0 ;
42         }
43         //m == 0,1时和 n == 1时均只有一种放法
44         if(m == 0 || n == 1 || m == 1 ){
45             return 1 ;
46         }else if(m < 0){
47             //m < 0 时,也是错误的情形,所以返回0
48             return 0 ;
49         }else{
50             //递归调用
51             return count(m-n,n) + count(m,n-1) ;
52         }
53     }
54 }

Code

扩展:

而如果是不允许有空盘子的情况,则可以由上面的情况推出,设 d ( n , k ) 表示把n个苹果放到k个盘子里,不允许有空盘子的方法总数,则有

f ( n , k ) = Σ ( 1 <= i <= k ) d ( n , i ) 所以 d ( n , k ) = f ( n , k ) - f ( n , k-1 )

转载于:https://www.cnblogs.com/mukekeheart/p/5594225.html

华为OJ平台——放苹果(典型整数划分问题)相关推荐

  1. 华为机试 放苹果

    题目描述 题目描述 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 数据范围:0<=m<=10,1& ...

  2. 华为OJ平台题目-砝码重量

    本人邮箱-> kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://github.com/kc ...

  3. 4.1 基础-放苹果(整数划分)

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

  4. 华为oj平台的新网址

    http://117.78.7.99/exam/camLogin.jsp 转载于:https://www.cnblogs.com/hewenwu/p/3981391.html

  5. 华为OJ平台——整形数组合并

    题目描述: 将两个整型数组按照升序合并,并且过滤掉重复数组元素 输入: 输入说明,按下列顺序输入: 1 输入第一个数组的个数 2 输入第一个数组的数值 3 输入第二个数组的个数 4 输入第二个数组的数 ...

  6. 华为OJ平台题目:(练习用)挑7

    描述 输出7有关数字的个数,包括7的倍数,还有包含7的数字(如17,27,37...70,71,72,73...)的个数 知识点 循环 运行时间限制 0M 内存限制 0 输入 一个正整数N.(N不大于 ...

  7. 华为OJ平台——将真分数分解为埃及分数

    题目描述: 分子为1的分数称为埃及分数.现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数.如:8/11 = 1/2+1/5+1/55+1/110. 输入: 输入一个真分数, ...

  8. c语言oj平台ratio,【华为OJ平台练习题】求最大公共子串的个数和元素

    #include #include using namespace std; vector prcs_2Strs(const char* s1,const char* s2) { vector pos ...

  9. 循环相乘取整法C语言,华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...

最新文章

  1. 在线作图|在线做Unifrac PCoA分析
  2. 什么是存储过程?什么是触发器?SQL中存储过程与触发器的区别是什么?
  3. JDK8中好用的日期处理-LocalDate类-LocalTime-LocalDateTIme,mysql解决时区相差13小时的问题,日期格式器DateTimeFormatter
  4. CTFshow php特性 web145
  5. 如何利用C/C++逐行读取txt文件中的字符串(可以顺便实现文本文件的复制)
  6. fzu - Problem 1759 Super A^B mod C
  7. 7.python字符串-内置方法分析
  8. document.createDocumentFragment 以及创建节点速度比较
  9. 微软中国推校园先锋计划,保障学生低价获取正版软件
  10. php 失去 焦点 另一个表单猎取值,同一表单如何根据某一个文本框的值 改变另一个文本框的值...
  11. 我的if else代码纯净无暇,一个字也不能简化
  12. zipOutputStream压缩后用RAR解压出现“不可预料的压缩文件末端”错误
  13. SNF快速开发平台MVC-集成了百度开源项目echars
  14. EXCEL 边框 去不掉的解决方法
  15. 关于文本编辑器的一点思考
  16. 数字后端基本概念介绍Size Blockage
  17. nodejs学习五:sequelize数据库查询的Op方法
  18. Fileupload使用方法
  19. 一些前端开发实用的函数—1(jquery)
  20. dedecms mytag_js.php,一种奇特的DEDE隐藏后门办法_91Ri.org

热门文章

  1. java初学课程_作为java新手应该学习什么课程
  2. aftool提示15天未更新_微信版本更新至7.0.15 视频号新增3种功能
  3. pytorch 之 加载不同形式的预训练模型
  4. SQL编程where子句与操作符
  5. python排序之sort和sorted
  6. [BUUCTF-pwn]——[极客大挑战 2019]Not Bad(ORW)(内涵peak小知识)
  7. [BUUCTF-pwn]——jarvisoj_fm
  8. 计算机hub体系部件,原来如此!USB Hub接口为啥都是4个7个或10个?
  9. java清除输出内容_java – 从JSch中的命令输出中删除shell东西...
  10. 三种excel 多条件计数方法