题目描述:

输入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 )

 import java.util.Scanner;

 /**
* 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,
* 问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
*/
public class PlayApples { public static void main(String[] args) {
//输入读取参数
Scanner cin = new Scanner(System.in) ;
int apples = cin.nextInt() ;
int planes = cin.nextInt() ;
cin.close(); System.out.println(count(apples,planes)) ; } /**
* 最典型的整数分解
* 例如给定n个苹果,把苹果放到k个盘子里,允许有的盘子为空, 不妨设 f(m , n )
* (边缘条件为当 m == 0 ,1时,返回1,当 n == 1 时,返回1)表示结果,
* 分析一下可以知道有两中放的方法,一种是有空盘,一种是没空盘,
* 没空盘的情况可以知道每个盘子里至少有一个苹果,也就是说这种情况的总数为 f ( n-k , k ) 。
* 而有空盘的情况,我们可以假设最后一个盘子为空,则这种情况的总数为f ( n , k-1 ) (无需考虑多个盘子为空的情况,递归时必然会出现)
* 所以状态转移方程为 f ( n , k ) = f ( n-k , k ) + f ( n , k-1 )。
*
* 而如果是不允许有空盘子的情况,则可以由上面的情况推出,
* 设 d ( n , k ) 表示把n个苹果放到k个盘子里,不允许有空盘子的方法总数,
* 则有f ( n , k ) = Σ ( 1 <= i <= k ) d ( n , i )
* 所以 d ( n , k ) = f ( n , k ) - f ( n , k-1 )
*
* @param m 苹果数量
* @param n 盘子数量
* @return
*/
private static int count(int m, int n) {
//n为0 是错误的,故返回0
if(n == 0){
return 0 ;
}
//m == 0,1时和 n == 1时均只有一种放法
if(m == 0 || n == 1 || m == 1 ){
return 1 ;
}else if(m < 0){
//m < 0 时,也是错误的情形,所以返回0
return 0 ;
}else{
//递归调用
return count(m-n,n) + count(m,n-1) ;
}
}
}

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 )

华为OJ平台——放苹果(典型整数划分问题)的更多相关文章

  1. 华为OJ之放苹果

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

  2. 华为OJ:2041 放苹果

    这道题难点不在于代码怎么写,而是思路怎么想. 感觉一般这样的题要么你理好一个思路要么你最后总结出一个公式,要么你自己模拟它的运作方式,用迭代,或者递归的方式来做. 有点像我们曾经学的排列组合. 对于m ...

  3. 华为OJ平台——字符串分隔

    题目描述: 连续输入字符串,请按长度为8拆分每个字符创 后输出到新的字符串数组: 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理 输入 连续输入字符串(输入两次,每个字符长长度小于100)输 ...

  4. 华为OJ平台——输出最小的k个数

    输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint ...

  5. 华为OJ平台——矩阵乘法

    题目描述: 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 输入: 1.第一个矩阵的行数 2.第一个矩阵的列数(也是第二个矩阵的行数) 3.第二个矩阵 ...

  6. 放苹果(整数划分变形题 水)poj1664

    问题:把M个相同的苹果放在N个相同的盘子里.同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 例子 : 1 7 3 ---------------8 ...

  7. 华为OJ平台——整数的二进制中1的个数

    题目描述: 输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 思路: 这是一道很基本的考查位运算的面试题.包括微软在内的很多公司都曾采用 ...

  8. 华为OJ平台试题 —— 数组:输入n个整数,输出当中最小的k个

    输入n个整数.输出当中最小的k个: 代码: /*  * 输入n个整数,输出当中最小的k个.  * 输入说明:1.输入两个整数:2.输入一个整数数组  * 输出说明:输出一个整数数组  */ <p ...

  9. 华为OJ平台——求最大连续bit数

    题目描述: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 输入: 一个byte型的数字    输出: 对应的二进制数字中1的最大连续数 思路: ...

随机推荐

  1. 黄聪:PHP字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、切割成数组等)

    一.字符串替换 str_replace("iwind", "kiki", "i love iwind, iwind said"); 将输出 ...

  2. PUA

    约会技巧 kino技巧 被拒绝的应对方法 (1)一般约会7个小时后,就能带女生回家 (2)点菜时多点一点,以回家放菜为名 (3)理由要文雅 (4)开酒店的理由 第一时间触碰测试 (1)第一次约会要第一 ...

  3. sql语句(mysql)

    MySQL1.数据库数据类型 int 整型 double 浮点型 如double(5,2)最多5位,其中有两位小数 char:固定长度字符串,如char(255),数据长度不足会用空格补足 varch ...

  4. Accounting_权责发生制和收付实现值的区别(概念)

    2014-07-11 BaoXinjian

  5. NeHe OpenGL教程 第三十七课:卡通映射

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  6. get/close not same thread Druid 连接池一个设置

    我就郁闷了,1000W+数据审核每次总是到一半就出这么个错,仔细找找原来是一个配置项的小问题,removeAbandonedTimeout 这个代表你从连接池取出一个连接多少秒之后你还没还回来,那就强 ...

  7. MySQL 绿色版安装方法图文教程

    一.下载,这里使用绿色解压缩版 http://mirror.services.wisc.edu/mysql/Downloads/MySQL-5.1/mysql-noinstall-5.1.32-win ...

  8. 8 个 Git 的小技巧

    git 已经成为了我日常必备工具之一,我总结我几乎每天使用的8个有用(且简洁)的git技巧.   使用-p选择性添加 当你想提交内容时,你可以通过使用 git commit -am 来选择所有文件或使 ...

  9. Jmeter+Jenkins集成html报告显示问题

    在J meter+Jenkins集成生成的html报告时,出现如下问题:无法正常显示表格,detail内容无法折叠和展开操作. 解决方法:执行下列脚本行 在Jenkins :系统管理--脚本命令行 S ...

  10. oracle 数据恢复,只有oradata文件夹里的文件,没有备份文件的数据库恢复,重装系统后,oracle 10g数据库恢复

    格式化重装系统后,才想起来oracle 10g 数据库没有做备份,开始以为很麻烦,没想到数据库恢复的还挺顺利的 恢复方法: 1,把原来的数据库文件备份,(D:\oracle\product\10.2. ...