m 升的水倒入 n 个相同的容器(容器无限大)
来源:互联网 发布:mac dare you日常吗 编辑:程序博客网 时间:2024/06/04 17:56
问题描述
要把 m 升的水倒入 n 个相同的容器中(假设容器足够大),允许有的容器是空的,问共有多少种不同的倒法?(用k表示)5,1,1和1,5,1和 1,1,5 是同一种倒法。 Input: 第一行是测试数据的数目 x(0 <= x <= 20)。以下每行均包含二个整数m和n,以空格分开。1<=m,n<=10。 Output: 对输入的每行数据m和n,用一行输出相应的k。
样例输入
17 3
样例输出
8
解题思路
样例分析
我们以输入样例举例子,假设有7升水,3个容器。我们手动的写出它所有的组合。分3种情况:
用一个容器
7、0、0
只有这一种组合
用两个容器
1、62、53、4
有上面三种组合
用三个容器
1、1、51、2、41、3、32、2、3
一共有四种组合
建立模型
我们用 f(m,n) 来表示 m 升水倒入 n 个容器的组合数
那么样例输入的例子可以表示为 f(7, 3)
7升水装入一个容器
我们很容易想到的表达式为 f(7,1),并且 f(7, 1) = 1
7升水装入两个容器
装入两个容器的意思是这两个容器中水的容量至少为1升。那么我们先把 7 升水拿出 2 升放入这两个容器中,则问题可以转化为 5 升水放入这 2 个容器中,即 f(5,2)
7升水装入三个容器
按照上面的思想,我们先拿出 3 升水装入这 3 个容器中,剩下 4 升水,那么问题可以转化为 f(4,3)
模型总结
通过上面的分析我们可以得出一个结论:
f(7,3) = f(7,1) + f(5,2) + f(4,3)
那么推广到 f(m,n):
f(m,n) = f(m,1) + f(m-2,2) + f(m-3,3) + ... + f(m-n,n)
可以得出,我们可以用递归来解决这个问题
边界数据
对于 f(m,n) 来说
m = 1 f(1,n) = 1;n = 1 f(m,1) = 1;m < n n = m; //如 f(2,3) 与 f(2,2) 的结果是一样的
Java源码
public class Main { public static void main(String[] args) throws FileNotFoundException { Singleton singleton = new Main(); File file = new File("D:/data"); Scanner scanner = new Scanner(file); int k = scanner.nextInt(); for (int i = 0; i < k; i++) { int m = scanner.nextInt(); int n = scanner.nextInt(); System.out.println(singleton.fun(m, n)); } } public int fun(int m, int n) { System.out.println("fun(" + m + "," + n + ")"); int sum = 0; if (m == 1 || m == 0 || n == 1) return 1; if (m < n) n = m; for (int i = 1; i <= n; i++) { if (i == 1) sum += fun(m, i); else sum += fun(m - i, i); } return sum; }}
输入
D:/data17 3
输出
fun(7,3)fun(7,1)fun(5,2)fun(5,1)fun(3,2)fun(3,1)fun(1,2)fun(4,3)fun(4,1)fun(2,2)fun(2,1)fun(0,2)fun(1,3)8
3 0
- m 升的水倒入 n 个相同的容器(容器无限大)
- m个苹果分在n个相同的盒子
- LintCode:M-装最多水的容器
- m 个相同的球放入n 个相同的盒子里
- 将m个相同的球全部放到n个相同的盒子里面有几种放法
- m个相同苹果放的n个相同盘子中的算法
- 宜信笔试题 把m升水倒入n个杯子
- java克隆容器后,容器内的对象相同
- 删除两个容器内相同的元素
- 将m个相同的球全部放到n个相同的盒子里面有几种放法,盒子不能为空
- 将m个相同的苹果放进n个相同的盘子中,盘子允许空,有多少种方法
- (11)分苹果问题:将m个相同的苹果放到n个相同的盘子中,多少钟分法?
- 将n个相同小球放入m个不同盒子内的放法种数
- Java实现从m个各不相同的元素中取出n个,并进行全排列。
- Java实现从m个各不相同的元素中取出n个,并进行全排列
- n个不同小球分配到m个相同的非空盒的方法数 组合数学-第二类stirling数
- TOP N 的 STL容器 实现
- poj 1664 放苹果 将m个相同的苹果放进n个相同的盘子中,盘子允许空,有多少种方法
- 企业究竟如何保存数据?从携程官网瘫痪事件说起
- R语言常用算法包
- AIX /var/adm/wtmp: Value too large to be stored in data type.
- 集合类的体系结构
- linux c常用字符串处理函数
- m 升的水倒入 n 个相同的容器(容器无限大)
- 使用开源库 Objective-C RegEx Categories 处理正则表达式
- git reset soft,hard,mixed之区别深解
- 热门威胁情报库深入分析
- 从头学习JAVA(二)
- ADB not responding
- IOS远程推送和本地推送的理解
- C# 常量关键字const
- 设计模式-建造者模式