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

时间: 2024-10-15 18:19:15

算法笔记——整数划分2的相关文章

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

算法笔记——整数划分1

题目来源:NYOJ90 问题描述: 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1. 正整数n的这种表示称为正整数n的划分.求正整数n的不 同划分个数.  例如正整数6有如下11种不同的划分:  6:  5+1:  4+2,4+1+1:  3+3,3+2+1,3+1+1+1:  2+2+2,2+2+1+1,2+1+1+1+1:  1+1+1+1+1+1. 输入: 第一行是测试数据的数目M(1<=M<=10).以下每行均包含一个整数n(1<

整数划分递归模板

/* 整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及. 所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,...,mi}为n的一个划分. 如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi)<=m,则称它属于n的一个m划分.这里我们记n的m划分的个数为f(n,m); 例如但n=4时,他有5个划分,{4},{3,1},{

51nod p1201 整数划分

1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2,3},共4种.由于数据较大,输出Mod 10^9 + 7的结果即可. Input 输入1个数N(1 <= N <= 50000). Output 输出划分的数量Mod 10^9 + 7. Input示例 6 Output示例 4 分析:这题关键在于不同的整数一个包含数字最多的划分必

算法笔记1-最大子序列和问题的求解

问题-- 给定N个整数(有可能是负数)A1,A2,A3,A4...An,求最大子序列和. (子序列必须是连续的):比如,对于输入,-2,11,-4,13,-5,-2:这个序列, 答案是20,即从A2到A4. 对于这个问题,你怎么想的呢?下面有四种解法,看看你的解法是不是其中之一. 解法一.穷举 解题思路-- 既然是求某一个连续的子序列的最大和,那么我们把所有的子序列的和都加一遍,然后用一个变量来存储最大的和值,当遍历一遍所有子序列,即可得到最大的和.由于这个子序列长度可以是1,也可以是N,因此需

整数划分

整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及.所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,...,mi}为n的一个划分. 如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi)<=m,则称它属于n的一个m划分.这里我们记n的m划分的个数为f(n,m); 例如但n=4时,他有5个划分,{4},{3,1},{2,2}

51nod1201 整数划分

01背包显然超时.然后就是一道神dp了.dp[i][j]表示j个数组成i的方案数.O(nsqrt(n)) #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i-

ACM 整数划分(四)

整数划分(四) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近遇到了一个难题,让他百思不得其解,他非常郁闷..亲爱的你能帮帮他吗? 问题是我们经常见到的整数划分,给出两个整数 n , m ,要求在 n 中加入m - 1 个乘号,将n分成m段,求出这m段的最大乘积 输入 第一行是一个整数T,表示有T组测试数据接下来T行,每行有两个正整数 n,m ( 1<= n <

hdu 1028 Ignatius and the Princess III(整数划分)

Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 12731    Accepted Submission(s): 8999 Problem Description "Well, it seems the first problem is too easy. I will let