问题一:将n划分为若干正整数之和,有多少种划分方法?(hdu1028)
思路一:相当于1-n的完全背包,总重量为n,有多少种组合?
思路二:dp[i][j]表示将i分为最多j组的划分方法数
转移方程为:dp[i][j] = dp[i][j-1] + dp[i-j][j] (i < j) //前者表示至多分成j-1份,后者表示分成j份(将i-j分成j份,剩下的j分成j个1加到刚刚的j份)
dp[i[j] = dp[i][j-1] + 1(i = j)
dp[i][j] = dp[i][i] (j > i)
问题二:将n划分为m个正整数之和,有多少种划分方法?
思路一:相当于1-n的完全背包,不过加了一维状态(二维费用背包)
思路二:dp[i][j]表示将i分为j组的划分方法数
转移方程为:dp[i][j] = dp[i-1][j-1] + dp[i-j][j](j <= i) //前者表示先分出一个1作为一份,然后剩下的i-1分成j-1份(至少有一个1),后者表示先分出j个1再将i-j分成j份,将他们加进去
dp[i][j] = 0(j > i)
问题三:将n划分为最大数不超过k的划分数
完全背包,不过可选范围变成1-k
问题四:将n划分为若干奇正整数之和
思路一:g[i][j]:将i划分为j个偶数;f[i][j]:将i划分为j个奇数
g[i][j] = f[i - j][j];f[i][j] = f[i - 1][j - 1] + g[i - j][j];
方法可以分为两类:
第一类:i中拿出j个1分到每一份中,将剩余的i-j分成j个奇数
第二类:一份包含奇数1,剩余的i-1分成j-1个奇数;另一种,每份至少大于1,将j个1拿出来分到每一份中,其余i-j分成j份
思路二:完全背包问题
问题五:将n划分为若干不同整数之和,有多少种?
思路一:0/1背包问题
思路二:dp[n][m]= dp[n][m-1]+ dp[n-m][m-1] dp[n][m]表示整数 n 的划分中,每个数不大于 m 的划分数。
分两种情况:
a.划分中每个数都小于m,相当于每个数不大于 m-1,划分数为 dp[n][m-1].
b.划分中有一个数为 m.在n中减去m,剩下相当对n-m进行划分,
并且每一个数不大于m-1,故划分数为 dp[n-m][m-1]