【算法基础】整数划分问题

【问题】将整数n表示为一系列正整数的和。

n = n1 + n2 + ...+ nk (n1 >= n2>=......>=nk>=1,k>=1) 

并称之为n的划分。不同的划分个数称为正整数n的划分数,p(n)

建立如下递归关系:

在不同的划分中,将最大的加数n1不大于m的划分数计做q(n,m)

1.q(n,1) = 1,n >= 1;表示,最大加数小于等于1,就是,n1<=1.而n1>=1,因此n1 = 1,该种类型划分只有一种。

2,q(n,m) = q(n,n),m>=n;因此,m >=n > n1. 对于数字m和n他们划分的最大加数,都不会比n大,就说明划分数相同。

3.q(n,n) = 1 + q(n,n-1);n的划分由n1 = n,和n1 <= n-1构成。

4.q(n,m) = q(n,m-1) + q(n-m,m),n > m > 1;

n的最大划分数n1不大于m的划分数(n1 <= m)由,n1 = m和n1 <= m-1构成。

n1 = m,则n2 + n3 + ...+nk = n - m,在对n-m中找到最大为m的划分。表示为q(n-m,m);

n1 <= m - 1,表为q(n,m-1)


【算法基础】整数划分问题_第1张图片

扩展:

【输入】标准的输入包含若干组测试数据。每组测试数据是一行输入数据,包括两个整数N 和 K。 

(0 < N <= 50, 0 < K <= N)

【输出】

对于每组测试数据,输出以下三行数据: 

第一行: N划分成K个正整数之和的划分数目 

第二行: N划分成若干个不同正整数之和的划分数目 

第三行: N划分成若干个奇正整数之和的划分数目

分析:

分为不同正整数包含:

1.n1 <= m -1 ,q(n,m-1)

2.n1 = m;在从n-m中找到最大为加数为m-1的划分。q(n-m,m-1)

q(n,m) = q(n,m-1) + q(n-m,m-1),分为若干不同数的划分数。

分为K个正整数的划分数:

设置f(n,k)表示为k个数的n的划分。

1.k个数中包含1:其余k-1个数去分n-1的划分。f(n-1,k-1)

2.k个数不包含1:每个数都比1大,k个数都分一个1.其余的n - k在分到k个数中的划分数。f(n - k,k)

f(n,k) = f(n - 1,k-1) + f(n - k,k)

分为若干个奇整数的和:

设置x(i,j),数字i划分为j个奇数的划分数,y(i,j)数字i划分为j个偶数的划分数。

1.包含1:减掉1后,i-1需要分配到j-1个奇数中,x(i-1,j-1)

2.不包含1:对j个奇数都减去1后,就是i-j的j个偶数的划分。y(i-j,j)

x(i,j) = x(i - 1,j-1) + y(i-j,j)


或:

1.m奇数。包含m:q(n -m,m),不包含m,q(n,m-1) ;q(n,m) = q(n -m,m) + q(n,m-1)

2.m偶数。q(n,m) = q(n,m-1)

你可能感兴趣的:(【算法基础】整数划分问题)