关于一些数的划分问题

来源:互联网 发布:python expect 编辑:程序博客网 时间:2024/05/29 03:28

问题一:将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]



原创粉丝点击