简单整数划分——动态规划

转载 2018年04月16日 20:25:01

转自:https://yq.aliyun.com/articles/445250
总时间限制: 100ms 内存限制: 65536kB
描述
将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。

输入
标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。
输出
对于每组测试数据,输出N的划分数。
样例输入
5
样例输出
7
提示
5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
递推表达式如下:

f(n, m)    =1;              (n=1 or m=1)
           =f(n, n);                (n<m)
           =1+ f(n, m-1);               (n=m)
           =f(n-m,m)+f(n,m-1);          (n>m)

我们定义 dp[n][k] 表示将n进行划分,最大的数不超过k的方案有多少种。关键是这个,
在递归中我们顶一顶是 f(n,k) ,而在动态规划中我们定义的是 dp[n][k]。然后将代码,照着递归写就差不多了,,
那么我们可以得到如下的递推方案:
dp[n][k] = dp[n][k-1] + dp[n-k][k];
很显然其中的dp[n][k-1]便是将n进行进行整数的划分,最大的数不超过k-1的方案数;dp[n-k][k]表示拿出一个k后,剩下的数被不超过k的数的表示的方案数。

其中当k>n的时候,则和dp[n][n]的值相同,下面通过递推的方式求出所有的解,然后对应的输入n,输出dp[n][n]就行了。

1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cstdio>
 5 using namespace std;
 6 
 7 const int MAX = 100;  
 8 int dp[MAX][MAX];//二维数组,对MAX进行划分,最大的数不超过MAX的方案数
 9 
10 void Dynamic()
11 {
12     for(int i=1; i<MAX; i++)
13     {
14         dp[i][1] = dp[1][i] = dp[0][i] = 1;//当nm==1时,dp[][]=1,
        //即方案数为1个,当n=0时,也为1,而当m=0时,则不为1
15     }
16     for(int i=2; i<MAX; i++)
17     {
18         for(int j=2; j<MAX; j++)
19         {
20             if(j<=i) dp[i][j] = dp[i][j-1] + dp[i-j][j];
        //如果m<n,即n>m 递推方程  f(n,m)=f(n-m,m)+f(n,m-1); 
        //为啥这里 将m==n的情况也包含进去了,原因是 dp[i-j=0][]=1,
        //和原表达式 f(n,m)=f(n,m-1)+1 结果一样,。。
21             else dp[i][j] = dp[i][i];
        // 如果 n<m f(n,m)=f(n,n)
22         }
23     }
24 }  
25 int main()  
26 {  
27     int n;
28     Dynamic();
29     while(scanf("%d",&n)!=EOF)
30     {
31         printf("%d\n",dp[n][n]);
32     }
33     return 0;  
34 }

OJ 7215 简单的整数划分问题__动态规划

描述 将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1&amp;gt;=n2&amp;gt;=…&amp;gt;=nk&amp;gt;=1 ,k&amp;gt;=1 。 正...
  • tp7309
  • tp7309
  • 2017-01-17 21:31:00
  • 435

整数划分总结(动态规划)

先引入一个比较实际的问题:分苹果 题目 M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放。 1...
  • huzhigenlaohu
  • huzhigenlaohu
  • 2016-08-13 11:23:52
  • 1142

动态规划解决整数划分的问题

前几天去华为做机试,遇到一个整数划分的问题,题目是:现有1,2,5,10,20,50,100 元这几种钱币,问给定n元能有多少种分配方式。例如n=4时,有1+1+1+1  ,1+2+1 , 2+2 三...
  • sxiaobei
  • sxiaobei
  • 2015-07-08 01:00:34
  • 1469

整数划分(动态规划)

经典问题。将正整数n表示成一系列正整数之和,n=n1+n2+..+nk  1. 将n划分成不大于m的划分法(多个整数可以相同) dp[n][m]= dp[n][m-1]+ dp[n-m][m...
  • hulamua
  • hulamua
  • 2017-04-12 13:39:44
  • 255

动态规划——整数划分

题目描述 Description 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。 例如:n=7,k=3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,...
  • u011860483
  • u011860483
  • 2015-02-27 15:27:51
  • 465

整数划分问题的动态规划算法

因为整数划分问题满足最优子结构和子问题重叠特征,故可以用动态规划算法来解。 分别使用了自顶向下的备忘录算法和自底向上动态规划算法,并且给出了一个优化算法。...
  • QiaoRuoZhuo
  • QiaoRuoZhuo
  • 2017-04-06 10:02:15
  • 1021

整数划分问题解法2-动态规划

整数划分 --- 一个老生长谈的问题:   1) 练练组合数学能力.   2) 练练递归思想   3) 练练DP   总之是一道经典的不能再经典的题目:   这道好题求:   1. 将n划...
  • Athenaer
  • Athenaer
  • 2012-12-06 15:21:26
  • 9278

HIT ~ 1402~整数划分问题(动态规划 or 母函数)

概念编辑所谓整数划分,是指把一个正整数n写成为其中,  为正整数,并且  ;  为n的一个划分。如果  中的最大值不超过m,即  ,则称它属于n的一个m划分。[1] 求划分个数编辑分析这里我们记n的m...
  • ZscDst
  • ZscDst
  • 2017-07-27 10:47:13
  • 573

OpenJudge_P7215 简单的整数划分问题(DP)

总时间限制: 100ms 内存限制: 65536kB 描述 将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。 正整数n 的这种...
  • qq_18455665
  • qq_18455665
  • 2015-12-05 08:43:41
  • 830

整数划分系列问题(动态规划)

今天上算法分析与设计课时,提到整数划分问题,但是因为之前没有很好地理解这一系列的问题。当被老师问到你们做算法的应该会这个问题吧,我当时也不太记得,但是只能硬头皮试着去写了下,用的是brute forc...
  • u012762625
  • u012762625
  • 2015-09-15 17:45:42
  • 471
收藏助手
不良信息举报
您举报文章:简单整数划分——动态规划
举报原因:
原因补充:

(最多只允许输入30个字)