算法笔记——整数划分2
题目来源:NYOJ176
问题描述:
把一个正整数m分成n个正整数的和,有多少种分法?
例:把5分成3个正正数的和,有两种分法:
1 1 3
1 2 2
输入:
第一行是一个整数T表示共有T组测试数据(T<=50)
每组测试数据都是两个正整数m,n,其中(1<=n<=m<=100),分别表示要拆分的正数和拆分的正整数的个数。
输出:
输出每组拆分的方法的数目。
分析:
题目可以换种等价描述:把m个同样的苹果放在n个同样的盘子里,不允许有的盘子空着不放,问共有多少种不同的分法,其中n个盘子是完全等价的?
假设用f(m,n)表示将m个苹果放入n个盘子中的方法,那么可以得到下面的递推关系式:
1、m < n时, f(m,n) = 0,因为不允许盘子空着;
2、m = n时, f(m,n) = 1,为了保证没有盘子空着,只能每个盘子放一个;
3、m > n时,先向每个盘子里面放入1个苹果,还剩下m-n个苹果,剩下的m-n个苹果可以选择放在1个、2个……n个盘子里,所以有:
f(m,n) = f(m-n,1) + f(m-n,2)+……+f(m-n,n)
4、初始条件:
当n=1时,f(m,n)=1,即只能将m个苹果放入这一个盘子中;
代码:
根据上面的递推式,同样可以写出递归和递推的代码。
递推代码见github:整数划分2