zoukankan      html  css  js  c++  java
  • 算法笔记——整数划分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

  • 相关阅读:
    函数指针与函数声明
    long和int的区别
    pthread_create传递参数
    C语言中的static 详细分析
    linux 读写锁应用实例
    linux使用读写锁pthread_rwlock_t
    linux的<pthread.h>
    时间:UTC时间、GMT时间、本地时间、Unix时间戳
    等号赋值与memcpy的效率问题
    单链表带头结点&不带头结点
  • 原文地址:https://www.cnblogs.com/DwyaneTalk/p/4617206.html
Copyright © 2011-2022 走看看