• 有关计数问题的dp


    问题一:划分数

    问题描述

    有n个去区别的物体,将它们划分成不超过m组,求出划分方法数模M的余数。
    我们定义dp[i][j],表示j的i划分的总数
    将j划分成i个的话,可以先取出k个,然后将剩下的j-k个分成i-1份。
    考虑n的m划分Ai,如果对于每一个i都有Ai>0,那么Ai-1就对应了n-md的m划分。另外如果存在Ai=0,那么就对应了n的m-1划分,则可以得到递推公式:
    a[i][j]=a[i][j-i]+a[i-1][j];

    #include<iostream>
    #include<stdio.h>
    #define MAX_M 100
    #define MAX_N 100
    using namespace std;
    int n,m,M;
    int dp[MAX_M+1][MAX_N+1];///dp[i][j]表示j的i划分的总数
    void solve()
    {
        dp[0][0]=1;
        for(int i=1; i<=m; i++)
        {
            for(int j=0; j<=n; j++)
            {
                if(j-i>=0)
                    dp[i][j]=(dp[i-1][j]+dp[i][j-i])%M;
                else
                    dp[i][j]=dp[i-1][j];
            }
        }
        printf("%d
    ",dp[m][n]);
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&M);
        solve();
        return 0;
    }
    

    问题二:多重集组合数

    问题描述:
    有n种物品,第i种物品有Ai个。不同种类的物品可以互相区分,但相同种类的无法区分。从这些物品中取出m个的话,有多少种取法?求出方案数模M的余数。

    分析:
    为了不重复计数,同一种类的物品最好一次性处理好。
    定义dp[i+1][j],表示从前i种物品中取出j个的组合总数
    从前i种物品中取出j个,可以从前i-1种产品中取出j-k个,再从第i种产品中取出k个

    #include<iostream>
    #include<stdio.h>
    #define MAX_M 100
    #define MAX_N 100
    using namespace std;
    int n,m,M;
    int a[MAX_N];
    int dp[MAX_M+1][MAX_N+1];
    void solve()
    {
        ///不管从多少种物品中取,取0个的方法有且仅有1种
        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]>=0)///加个M避免减法过后产生负数
                    dp[i+1][j]=(dp[i+1][j-1]+dp[i][j]-dp[i][j-1-a[i]]+M)%M;
                else
                    dp[i+1][j]=(dp[i+1][j-1]+dp[i][j])%M;
            }
            printf("%d
    ",dp[n][m]);
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&M);
        for(int i=0; i<n; i++)
            scanf("%d",&a[i]);
        solve();
        return 0;
    }
    
  • 相关阅读:
    Silverlight 游戏开发小技巧:扇形排列元素
    Silverlight C# 游戏开发:L9 天空盒
    快乐技术开发者沙龙银光聚会第二期
    Silverlight 游戏开发小技巧:动感弹出动画
    Silverlight 游戏开发:可重用的拖拽控件
    获微软MVP
    Silverlight 游戏开发小技巧:动感小菜单1
    Protobuf语言指南
    使用xrdp或Xmanager 远程连接 CentOS6
    Linux 下使用 NMON 分析系统性能(其他如dstat、iostat)
  • 原文地址:https://www.cnblogs.com/cmmdc/p/7197263.html
Copyright © 2020-2023  润新知