整数划分问题

原创 2016年05月30日 21:52:29

递归经典问题
将正整数表示成一系列整数之和
n = n1 + n2 + n3 +++ nk n1>=n2>=n3 >=nk >= 1;
正整数n的这种表示称为正整数n的划分。求正整数n的不同划分个数
例如 5 可以划分为(5), (4,1),(3,2),(3,1,1),(2,2,1)(2,1,1,1)(1,1,1,1,1)。总共7种可能。
建立q(n,m)n为正整数的划分, m为其中最大的加数。
接下来就是分类讨论的时光了
1: n = 1 m无论为何值 只有一种分法 (1)
2: m = 1 n无论为何值 只有一种分法 (1+1+1 ++ ) 总共有n个1在加。
3:n < m 最大的加数比n还大 则变为q(n,m)。
4:n == m 时
子讨论时光又到了
4:1 当分法中包含m时 只有一种分法(m)
4:2 当分法不包含m时 我们刚开始说m是加数 现在分法中不包含m 所以最大的加数现在是m-1
则 q(n,n) = 1 + q(n,n-1)。
5:n > m 时
子讨论时光
5:1当分法中包含m时 (m,n1 + n2 + + nk) n1加到nk的值就是n-m 递归就是子问题与原问题一样只是范围一样 则 q(n-m,m)划分的数变成n-m 最大加数还是m
5:2当分法中不包含m时最大加数变为m-1
综合5 q(n,m) = q(n-m,m) + q(n,m-1)
大综合

q(n,m) n = 1或者m=1 1
n < m q(n, n)
n = m q(n,n-1) + 1
n > m q(n-m,m) + q(n,m-1)。

int q(int n, m)
{
    if(n < 1 || m < 1)
        return 0;
    if(n == 1 || m == 1)
        return 1;
    if(n < m)
        return q(n, n);
    if(n == m)
        return q(n,n-1) + 1;

    return q(n-m,m) + q(n, m-1);//最后一种情况    
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

简单网页数据传递

提交 Username:

九度cin/cout耗时原因

做九度题的时候,由于数据量大,很多情况下得用scanf和printf代替cin和cout用于输入输出,不然会报错超时不能AC。 有三条建议用于提高C++的输入输出速度: At the firs...

归纳法实现整数划分问题

  • 2014年04月04日 20:09
  • 400B
  • 下载

11088 整数划分的扩展问题

  • 2016年06月30日 23:38
  • 839B
  • 下载

整数划分问题算法分析与实现(递归)

把一个正整数n写成多个大于等于1且小于等于其本身的整数的和,则其中各加数所构成的集合为n的一个划分。 把一个正整数n写成为 n=m1+m2+…+mi。其中,mi为正整数,并且1≤mi≤n;{m1,m...

整数划分问题

  • 2013年10月10日 13:02
  • 4KB
  • 下载

整数划分问题

  • 2012年04月05日 22:26
  • 47KB
  • 下载

OpenJudge简单的整数划分问题两种方法(DFS)(动态规划0ms),全局题号7215,已AC

描述 将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。 正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整...

整数划分问题java源码

  • 2014年01月21日 10:35
  • 4KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:整数划分问题
举报原因:
原因补充:

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