多重集组合数 简单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 ...
随机推荐
- Java集合XMind与注意事项
Java中集合使用时的几个注意事项: 1.ArrayList和HashMap都具有扩容 ArrayList初始化数组长度为10,扩容后的容量为原来的1.5倍. HashMap初始化的数组长度为16,扩 ...
- Flyway 的使用及Spring Boot集成Flyway
一.简单介绍 Flyway 是一个开源.跨环境的数据库迁移工具,它强烈主张简单性和约定性而不是配置. Flyway 是一个便于多人开发对数据库管理的工具,将sql语句写入文件中,只需要在控制台输入指令 ...
- overflow:hidden;zoom:1;外框自适应 [转]
在排页面时,碰到了,外框里的元素用fluid 布局,外框的高度不能适应的问题,查了一下资料,发现了博友的一篇文章,解决了这个问题,现在分享给大家. 解释不到位的请大牛补充~~~~~~ 高度自适应: h ...
- 编写SQL语句(快速回顾)
注:源自于<Java程序员面试秘笈>! 1.创建数据库MYDB create database MYDB 2.创建学生表student (sno,sname,ssex,sage,sclas ...
- Qt中字符串和数值之间的转换
来自<Qt5.9 C++开发指南> 普通数值和字符串之间的转换 一.从字符串转换为数值 QString类从字符串转换为整数的函数有: int QString::toInt(bool *ok ...
- 【LaTeX】记录一下LaTeX的安装和使用
由于排版论文的需要,了解了一些LaTeX的相关内容,下面简单记录关于LaTeX的安装和使用 维基百科: LaTeX(/ˈlɑːtɛx/,常被读作/ˈlɑːtɛk/或/ˈleɪtɛk/),文字形式写作L ...
- Integer缓存机制-基本数据类型和包装类型-自动拆装箱
Integer缓存机制 总结: 1.jdk1.5对Integer新增了缓存机制,范围在-128-127(这个范围的整数值使用频率最高)内的自动装箱返回的是缓存对象,不会new新的对象,所以只要在缓存范 ...
- 为什么你精通CRUD,却搞不懂数据库的基本原理?
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图
- Linux内存管理解析(三) : 内核对内核空间的内存管理
内核采用 struct page 来表示一个物理页,在其中记载了诸多物理页的属性,比如 物理页被几个线程使用(如若没有则表示该页可以释放),页对应的虚拟地址. 首先需要知道的是,分配物理页可以分为两个 ...
- vue框架中props的typescript用法
vue框架中props的typescript用法 在vue中使用typescript时,需要引入vue-property-decorator库来兼容格式. javascript写法 Vue.compo ...