相加型整数划分总结篇

来源:互联网 发布:商务推广软件 编辑:程序博客网 时间:2024/06/03 12:17

整数划分经典问题:

相加型划分总结:
整数划分问题主要可以分成两种解决方法;
1.dp[i][j]代表 n为i,j作为划分的最大数限制的方法数。
这种方式要考虑i,j三种情况分别处理,i < j时主要思考方向是存在j否。(取j,dp[i-j][j])
2.dp[i][j]代表 n为i,j作为划分的个数限制的方法数。
这种方式只考虑i < j情况,i < j时主要思考方向是存在1否。(截边,dp[i-j][j])


具体:

一. 求整数划分若干(不大于k)整数和的划分数
(没有最大数限制k为n)
1.整数可以相同:
dp[i][j]代表: n为i,并划分为j以下的数方法数
初始化: dp[i][j] = 0。
(1) 当i < j 时,i不能划分为大于i的数。
(2) 当i > j 时,可以根据划分中是否含有j分为两种情况。若划分中含有j,划分方案数为dp[i-j][j];若划分数中不含j,相当于将i划分为不大于j-1的划分数,为dp[i][j-1]。
(3) 当i = j 时,若划分中含有j只有一种情况,若划分中不含j相当于将i划分为不大于j-1的划分数。
总结递推式:
【i > j 】 dp[i][j] = dp[i][j-1] + dp[i-j][j];
【i == j】 dp[i][j] = dp[i][j-1] + 1;
【i < j 】 dp[i][j] = dp[i][i];
**************小划分线*****************
2.整数必须不同:
dp[i][j]代表: n为i,并划分并划分为j以下并不相同的数方法数
初始化: dp[i][j] = 0。
(1) 当i < j 时,i不能划分为大于i的数。
(2) 当i > j 时,可以根据划分中是否含有j分为两种情况。若划分中含有j,因为数要不相同,划分方案数为dp[i-j][j-1];若划分数中不含j,相当于将i划分为不大于j-1的划分数,为dp[i][j-1]。
(3) 当i = j 时,若划分中含有j只有一种情况,若划分中不含j相当于将i划分为不大于j-1的划分数。
总结递推式:
【i > j 】 dp[i][j] = dp[i][j-1] + dp[i-j][j-1];
【i == j】 dp[i][j] = dp[i][j-1] + 1;
【i < j 】 dp[i][j] = dp[i][i];
————————————划分————————————
二. 求将n划分成k个正整数之和的划分数
dp[i][j]代表: n为i,并分成j个正整数的和时的方法数。
(1) i < j为不可能出现的情况,dp[i][j]=0;
(2) 若i = j,有一种情况:i可以划分为i个1之和,dp[i][j]=1;
(3) 若i > j,可以根据划分数中是否含有1分为两类:若划分数中含有1,可以使用“截边法”将j个划分分别截去一个1,把问题转化为i-j的j-1个划分数,为dp[i-j][j-1]; 若划分中不包含1,使用“截边法”将j个划分数的最下面一个数截去,将为题转化为求i-j的j个划分数,为dp[i-j][j]。
总结递推式:
dp[i][j] = dp[i-1][j-1] (有1的情况) + dp[i-j][j] (没有1的情况)
————————————划分————————————
三. 将n划分成若干个奇正整数之和的划分数。
f[i][j]为将i划分为j个奇数之和的划分数;
g[i][j]为将i划分为j个偶数之和的划分数;
(1)使用截边法,将g[i][j]的j个划分都去掉1,可以得到f[i-j][j]。
(2)f[i][j]中有包含1的划分方案和不包含1的划分方案。对于包含1的划分方案,可以将1的划分除去,即f[i-1][j-1];对于不包含1的划分方案,可以使用截边法对j个划分每一个都去掉一个1,即g[i-j][j]。
递推式:
g[i][j] = f[i-j][j]
f[i][j] = f[i-1][j-1]+g[i-j][j]
f[n][0]+f[n][1]+……+f[n][n]为将n划分为若干奇数的划分数
————————————划分————————————

0 0