计数dp 划分数 多重集组合数

原创 2018年04月17日 20:33:13

 挑战程序设计竞赛

划分数:把n个无区别的物品划分成不超过m组。
dp[i][j]=j的i划分的总数。
dp[i[j]=dp[i][j-i]+dp[i-1][j] 即:将j个物品分成i份,有两种情况:每份划分都大于等于1 dp[i][j-i]; 存在有一份以上用0划分dp[i-1][j]

int main()
{
    int n,m;
    cin>>n>>m;
    dp[0][0]=1;
    for(int i=1;i<=n;i++)
        for(int j=0;j<=n;j++)
        {
            if(j>=i)
                dp[i][j]=dp[i][j-i]+dp[i-1][j];
            else
                dp[i][j]=dp[i-1][j];
        }
    cout<<dp[m][n]<<endl;
    return 0;
}

多重集组合数:n种物品,第i种有a[i]个,从中选取m个,有多少种不同的选择方法?
dp[i+1][j]:从[0, i]号物品中选取j个物品的方法。
dp[i+1][j] = dp[i][j] + dp[i+1][j-1]
这是我们很直观想到的一个递推关系:dp[i][j]表示从i号物品中选0个, dp[i+1][j-1]从i号物品中至少选择1个
实际上,由于是多重集而不是完全集合,我们已经选取了一个i号物品,所以dp[i+1][j-1]表示的不是从i号物品中选择至少一个的数目,因为dp[i+1][j-1]包含了选取a[i]个i号物品(此时总共选择了a[i]+1个物品了),这种情况是应该去掉。需要减去dp[i][j-a[i]-1],所以应该是###dp[i+1][j] = dp[i][j] + dp[i+1][j-1] - dp[i][j-1-a[i]];

void solve()
{
    for(int i=0;i<=n;i++)
        dp[i][0]=1;
    for(int i=0;i<n;i++)
        for(int j=1;j<=m;j++)
        {
            if(j-1>=a[i])
                dp[i+1][j]=(dp[i+1][j-1]+dp[i][j]-dp[i][j-1-a[i]]+mod)%mod;
            else
                dp[i+1][j]=(dp[i+1][j-1]+dp[i][j])%mod;
        }
    cout<<dp[n][m];
}

POJ 3046 Ant Counting(dp—多重集组合数问题)

 Ant Counting Time Limit: 1000MS Memory Limit: 65536K Total Subm...
  • zwj1452267376
  • zwj1452267376
  • 2016-01-02 17:49:19
  • 723

有关计数问题的DP 划分数

有n个无区别的物品,将它们划分为不超过m组,求出划分方法数模M的余数。 限制条件: 1≤m≤n≤1000 2≤M≤10000 输入 n = 4 m = 3 M = 10000 输出 4 (1+...
  • huangshuai147
  • huangshuai147
  • 2016-09-16 20:34:47
  • 504

挑战程序设计竞赛2.3.3 有关计数问题的DP 多重集组合数

这小节公式的变形,开始没看懂,自己做了一下,这里留个笔记。变形后得出最终的递推公式。 dp的意义说中有讲解。...
  • Revivedsun
  • Revivedsun
  • 2015-04-28 12:49:31
  • 929

动态规划(01背包、完全背包、多重部分和、LCS、LIS、划分数、多重集组合数)

Learn and Review 动态规划入门
  • mirror58229
  • mirror58229
  • 2017-03-19 16:03:13
  • 420

多重集组合数-DP

题目: 有n种物品, 第i种物品有a个. 不同种类的物品可以互相区分, 但相同种类的无法区分. 从这些物品中取出m个, 有多少种取法? 求出数模M的余数. 例如: 有n=3种物品, 每种a...
  • viphong
  • viphong
  • 2015-08-31 00:19:52
  • 2063

nyoj 90 整数划分【dp划分数】

整数划分 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,  其中n1≥n2≥…≥nk≥1,k≥1。 ...
  • liuke19950717
  • liuke19950717
  • 2016-03-30 18:05:09
  • 1069

多重集组合数(动态规划(DP))

注:文章内容源自《挑战程序设计竞赛》(第二版) 原题 多重集组合数 有 n 种物品,第 i 种物品有 ai 个。不同种类的物品可以相互区分但是相同的种类无法区分。从这些物品中取出 m 个的话,有...
  • Zhao_Xinhao
  • Zhao_Xinhao
  • 2017-08-29 18:58:53
  • 162

划分数dp 小结

小结划分数如何dp1.hdu 1028 整数划分首先,我们引进一个小小概念来方便描述吧,dp[n][m]是把自然数划划分成所有元素不大于m的分法,例如: 当n=4,m=1时,要求所有的元素都比m小,...
  • guhaiteng
  • guhaiteng
  • 2017-04-04 23:05:18
  • 232

有关计数问题的DP 划分数

有n个无区别的物品,将它们划分成不超过m组,求出划分方法数模M的余数。 输入: 3 4 10000 输出: 4(1+1+2=1+3=2+2=4) 定义:dp[i][j] = j的i划分的总数 #i...
  • a2459956664
  • a2459956664
  • 2016-04-02 16:51:20
  • 917

POJ3046 多重集组合数 dp+前缀和优化+滚动数组 (包含类似优化的小总结)

题意 T种数,每种有a[t]个,总共有A个数。问你取其中X个数作为子集,有多少种这样的子集。计算L...
  • luke2834
  • luke2834
  • 2015-10-27 12:09:48
  • 692
收藏助手
不良信息举报
您举报文章:计数dp 划分数 多重集组合数
举报原因:
原因补充:

(最多只允许输入30个字)