算法笔记——整数划分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

原文地址:https://www.cnblogs.com/DwyaneTalk/p/4617131.html