多重集组合数 简单dp
#include <cstdio>
#include <iostream> using namespace std; const int max_n = +;
const int max_m = +;
const int max_a = +;
const int max_M = 1e4+; int n,m,M;
int a[max_n];
int dp[max_M][max_M];
// dp[i][j]:从前i件商品中,选出j个的组合数 void solve()
{
// 初始化dp数组,无论当前有多少件,一件都不取的方法只有一种哦
for(int i=;i<=n;++i)
{
dp[i][]=;
} // 从第一件物品开始取
for(int i=;i<=n;++i)
{
// 从取一件开始,0件时已初始化为1
for(int j=;j<=m;++j)
{
// 注意这里考虑最原始的搞复杂度朴素算法情况,发现有重复的,进行降复杂度变化
// 数组中,考虑为数组上一行的所有可行解之和
// 改为当前位置,同行前一元素与同列上一元素之和
// 当前行因为最多只能取a[i]个,所以在满足j的条件下,还要考虑此种情况 // j<=a[i]时,可以取遍之前元素,直接上左相加即可
if(j--a[i] < )
{
dp[i][j]=(dp[i-][j] + dp[i][j-]) % M;
}
// 否则只能取a[i]个
// 考虑数组的动态变化过程
// 所遍历的元素总数为a[i]不变,这a[i]个元素在数组中的位置,往后移了一位
// 移位前一个的最先元素不满足,应减去,然后加上新加元素(即当前元素之上的元素即可)
else
{
dp[i][j]=(dp[i-][j] + dp[i][j-] - dp[i-][j--a[i]]) % M;
}
// 可以输出查看数组,加深理解
// 也可以在出错时输出检查条件和初值
//printf("%d ",dp[i][j]);
}
//printf("\n");
} printf("%d\n",dp[n][m]);
} int main()
{
scanf("%d %d %d",&n,&m,&M);
// a[i]: 第i件商品的数量
for(int i=;i<=n;++i)
{
scanf("%d",&a[i]);
}
solve(); return ;
} /*test
3 3 1000
1 2 3 */
多重集组合数 简单dp的更多相关文章
- POJ 3046 Ant Counting ( 多重集组合数 && 经典DP )
题意 : 有 n 种蚂蚁,第 i 种蚂蚁有ai个,一共有 A 个蚂蚁.不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别.从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法. 分析 : ...
- 简单dp总结
### 简单dp总结 本文是阅读<挑战程序设计第二版>其中关于dp章节所作总结.将简要描述dp的部分知识. 一.dp是什么? dp在计算机专业学科中全称是动态规划(dynamic prog ...
- Vijos_1792_摆花_(动态规划,多重集组合数)
描述 https://vijos.org/p/1792 共n种花,第i种花有a[i]个,要摆m个,同一种花连续且花按照序号从小到大排,问共有多少种摆花方案. 描述 小明的花店新开张,为了吸引顾客, ...
- POJ_3046_Ant_Counting_(动态规划,多重集组合数)
描述 http://poj.org/problem?id=3046 n种蚂蚁,第i种有ai个,不同种类的蚂蚁可以相互区分,但同一种类的蚂蚁不能相互区分,从这些蚂蚁中取出s,s+1,s+2,...,b- ...
- poj 3046 Ant Counting(多重集组合数)
Ant Counting Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total ...
- HDU 1087 简单dp,求递增子序列使和最大
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- Codeforces Round #260 (Div. 1) A. Boredom (简单dp)
题目链接:http://codeforces.com/problemset/problem/455/A 给你n个数,要是其中取一个大小为x的数,那x+1和x-1都不能取了,问你最后取完最大的和是多少. ...
- codeforces Gym 100500H A. Potion of Immortality 简单DP
Problem H. ICPC QuestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100500/a ...
- 简单dp --- HDU1248寒冰王座
题目链接 这道题也是简单dp里面的一种经典类型,递推式就是dp[i] = min(dp[i-150], dp[i-200], dp[i-350]) 代码如下: #include<iostream ...
随机推荐
- 消息中间件面试题31道RabbitMQ+ActiveMQ+Kafka
消息中间件面试题31道RabbitMQ+ActiveMQ+Kafka 前言 文章开始前,我们先了解一下什么是消息中间件? 什么是中间件? 非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的, ...
- Linux下静态ip的配置
------------恢复内容开始------------ TYPE=Ethernet BOOTPROTO=static#dhcp改为static,采用静态方式 DEFROUTE=yes IPV4_ ...
- TypeError:Can't instantiate abstract class Ultraman with abstract methods sttack 报错
报错Can't instantiate abstract class Ultraman with abstract methods sttack 通过非常仔细的排查,发现错误如下: 1.单词拼写错误是 ...
- NLP新秀 - Bert
目录 什么是Bert Bert能干什么? Bert和TensorFlow的关系 BERT的原理 Bert相关工具和服务 Bert的局限性和对应的解决方案 沉舟侧畔千帆过, 病树前头万木春. 今天介绍的 ...
- [python之路]简单介绍
python介绍 #python是一个什么样的语言?编译型和解释型静态语言和动态语言强类型定义语言和弱类型定义语言python是一门动态解释性的强类型定义语言. #Python的优缺点##优点Pyth ...
- LeetCode 681. Next Closest Time 最近时刻 / LintCode 862. 下一个最近的时间 (C++/Java)
题目: 给定一个"HH:MM"格式的时间,重复使用这些数字,返回下一个最近的时间.每个数字可以被重复使用任意次. 保证输入的时间都是有效的.例如,"01:34" ...
- Jmeter之cookie处理
前言 小伙伴们利用Jmeter进行接口测试时,有没遇到有依赖的接口,需要上一个接口的cookies值,下一个接口才能跑通的情况呢?例如登录和余额查询的接口,这些需要cookies的接口要怎么处理呢? ...
- 后台+下载(wget)+多个下载url
有时候我们需要让linux下载多个文件,并且后台下载,不去占用当前控制台. 比如我们需要下载中文维基的三个文件: https://dumps.wikimedia.org/zhwiki/latest/z ...
- win 8.0.12
一.下载 下载页面http://dev.mysql.com/downloads/mysql/ 选择系统平台后,点击download(根据系统选择64或32位) 二.配置 1.下载成功后,解压安装包到要 ...
- 终于成功部署 Kubernetes HPA 基于 QPS 进行自动伸缩
昨天晚上通过压测验证了 HPA 部署成功了. 所使用的 HPA 配置文件如下: apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscale ...