您的位置:首页 > 其它

整数划分问题

2016-05-30 21:52 204 查看
递归经典问题

将正整数表示成一系列整数之和

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);//最后一种情况
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  基础算法