问题一:划分数

问题描述

有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\n",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\n",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;
}

有关计数问题的dp的更多相关文章

  1. 有关计数问题的DP 划分数

    有n个无差别的物品,将它们划分成不超过m组.求出划分方法数模M的余数. 输入: 3 4 10000 输出: 4(1+1+2=1+3=2+2=4) 定义:dp[i][j] = j的i划分的总数 #inc ...

  2. POJ 3046 Ant Counting ( 多重集组合数 && 经典DP )

    题意 : 有 n 种蚂蚁,第 i 种蚂蚁有ai个,一共有 A 个蚂蚁.不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别.从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法. 分析 :  ...

  3. [2019杭电多校第一场][hdu6578]Blank(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6578 计数问题想到dp不过分吧... dp[i][j][k][w]为第1-i位置中4个数最后一次出现的 ...

  4. 洛谷 P7620 - CF1431J Zero-XOR Array(状压 dp)

    洛谷题面传送门 首先显然题目等价于求有多少个长度 \(n-1\) 的序列 \(b\) 满足 \(a_i\le b_i\le a_{i+1}\),满足 \(b_1\oplus b_2\oplus\cdo ...

  5. 【tyvj P4879】骰子游戏

    http://www.tyvj.cn/p/4879 首先,投一个骰子,每个数字出现的概率都是一样的.也就是不算小A的话,n个人投出x个骰子需要的次数和点数无关. 计数问题考虑dp,令f(i,j)为前i ...

  6. Contest1593 - 2018-2019赛季多校联合新生训练赛第三场(部分题解)

    H 10255 自然数无序拆分 H 传送门 题干: 题目描述 美羊羊给喜羊羊和沸羊羊出了一道难题,说谁能先做出来,我就奖励给他我自己做的一样礼物.沸羊羊这下可乐了,于是马上答应立刻做出来,喜羊羊见状, ...

  7. NOIWC前的交流题目汇总

    RT 2018.12.27 i207M:BZOJ 4695 最假女选手 以维护最大值为例,记录最大值和严格次大值和最大值的出现次数,然后取min的时候递归到小于最大值但大于次大值修改,这个就是最重要的 ...

  8. HDU 4832(DP+计数问题)

    HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行.然后相乘累加起来就是答案 代码: #include <stdio.h> #include < ...

  9. [计数问题dp]子数列的个数

    http://www.51nod.com/tutorial/course.html#!courseId=15 解题关键:主要是一种思想 $dp[i] = dp[i - 1]*2$ 如果a[i]不在之前 ...

随机推荐

  1. week1技术随笔

    2016-09-06 2016年9月3日 类别c 内容c 开始时间s 结束时间e 被打断时间I 总计(min) 读书 读构建之法  8:40  10:00  11  69 读书 构建之法-个人能力 , ...

  2. ZOJ 1913 J-Eucild's Game

    https://vjudge.net/contest/67836#problem/J Two players, Stan and Ollie, play, starting with two natu ...

  3. Linux环境PHP5.6升级7.1.8

    PHP7和HHVM比较PHP7的在真实场景的性能确实已经和HHVM相当, 在一些场景甚至超过了HHVM.HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导致crash了, 那么整个服务就挂 ...

  4. File文件以及.propertites文件操作

    File文件操作 在jsp和class文件中调用的相对路径不同.在jsp里,根目录是WebRoot 在class文件中,根目录是WebRoot/WEB-INF/classes 当然你也可以用Syste ...

  5. [C/C++] 结构体存储问题

    64位操作系统,不同类型变量对应的字节数为: char : 1个字节 char*(即指针变量) : 8个字节 //32位占4个字节 short int : 2个字节 int : 4个字节 unsign ...

  6. 前端基础:JavaScript BOM对象

    JavaScript BOM对象 JavaScript Window - 浏览器对象模型 浏览器对象模型(BOM)使JavaScript有能力与浏览器"对话". 浏览器对象模型(B ...

  7. C# 利用FTP自动下载xml文件后利用 FileSystemWatcher 监控目录下文件变化并自动更新数据库

    using FtpLib; using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...

  8. [CF1037H] Security

    题目链接 codeforces. 洛谷. Solution 按照套路,可以\(SAM\)上线段树合并求出\(endpos\)集合,然后随便贪心一下就好了. #include<bits/stdc+ ...

  9. BZOJ1858:[SCOI2010]序列操作——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1858 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于 ...

  10. BZOJ2795/2890/3647 [Poi2012]A Horrible Poem 【字符串hash】

    题目链接 BZOJ2795 BZOJ2890 BZOJ3647 题解 三倍经验! 我们要快速求区间最小循环节 我们知道循环节有如下性质: ①当\(L\)为循环节长度,那么\(s[l...r - L] ...