算法笔记——整数划分3

题目来源:POJ1664-放苹果 和POJ3014

问题描述:

  把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

输入:

  第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数m和n,以空格分开。1<=m,n<=10。

输出:

  对输入的每组数据m和n,用一行输出相应的K。

分析:

  问题描述转换成整数划分形式:把一个正整数m分成至多n个正整数的和,有多少种分法?

  假设用f(m,n)表示将m个苹果放入n个盘子中的方法,n个盘子可以分为有空的和没有空的两种情况,那么可以得到下面的递推关系式:

    1、当m < n时,则必有盘子空着,假设某个盘子空着,将m个苹果放入剩下的n-1个盘子中:

      f(m, n) = f(m, n-1)

    2、当m = n时,没有盘子空只存在每个盘子一哥苹果的情况。对于存在盘子空着的情况,假设某个盘子空着,将m个苹果放入剩下的n-1个盘子中:

      f(m, n) = f(m, n-1) + 1

    3、当m > n时,没有盘子空着,则先每个盘子放一个苹果,剩下的m-n个在放入n个盘子中。对于存在盘子空着的情况,假设某个盘子空着,将m个苹果放入剩下的n-1个盘子中:

      f(m, n) = f(m, n-1) + f(m - n, n)

    初始条件:

      n = 1时,f(m, n) = 1;

代码:

  根据上面的递推式,同样可以写出递归和递推的代码。  

  递推代码见github:整数划分3

posted @ 2015-07-02 21:41  DwyaneTalk  阅读(...)  评论(... 编辑 收藏