CodeForces 544C (Writing Code)(dp,完全背包)
题意:有n个程序员,要协作写完m行代码,最多出现b个bug,第i个程序员每写一行代码就会产生a[i]个bug,现在问,这n个人合作来写完这m行代码,有几种方案使得出的bug总数不超过b(题中要求总方案数要对一个特定的数取模)?
分析:
这道题目属于dp中的计数类型,即求出方案数。一般来说,为了求出方案数,要将现存的问题分为2个或2个以上完全不重叠的子问题。这就类似于,有n层楼梯,你可以一次跨1阶,或者一次跨2阶,问你有多少种上楼梯的方法一样。
在上楼梯问题中,我们可以在当前状态的第一步跨上1阶,或者在当前状态的第一步跨上2阶,这样,原问题就被分解成了两个完全没有交集的子问题,因为第一步跨法不同,那么不论我们以后怎么上楼梯,都不可能出现相同的走法。即dp[i] = dp[i-1] + dp[i-2]。
那么,对于这道题,我们可以将是否让第i个程序员写代码作为分界标准来分出子问题。
状态定义:dp[i][j][k]--->现在有i个程序员合作,一共有j行代码待完成,最多出k个bug的方案总数。
状态转移方程:dp[i][j][k] = dp[i-1][j][k] + dp[i][j-1][k-a[i]];
注意初始化条件,当j为0时,无论i,k取多少,方案数都为1,即无代码可写,那么我们都有1个方案,就是不派出程序员写代码。
AC代码:(采用了滚动数组)
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define maxn 505
using namespace std;
int dp[][maxn][maxn];
int ai[maxn];
int main()
{
int n,m,b,mod;
while(scanf("%d%d%d%d",&n,&m,&b,&mod) == ){
memset(dp,,sizeof(dp));
for(int i = ;i <= ;++i)
for(int j = ;j <= b;++j)
dp[i][][j] = ;
for(int i = ;i <= n;++i)
scanf("%d",&ai[i]);
for(int i = ;i <= n;++i)
for(int j = ;j <= m;++j)
for(int k = ;k <= b;++k){
dp[i & ][j][k] = dp[(i - ) & ][j][k] % mod;
if(k - ai[i] >= ) dp[i & ][j][k] = (dp[i & ][j][k] + dp[i & ][j - ][k - ai[i]]) % mod;
}
printf("%d\n",dp[n & ][m][b] % mod);
}
return ;
}
注意,有k<a[i]的情况。
CodeForces 544C (Writing Code)(dp,完全背包)的更多相关文章
- CodeForces 543A - Writing Code DP 完全背包
有n个程序,这n个程序运作产生m行代码,但是每个程序产生的BUG总和不能超过b, 给出每个程序产生的代码,每行会产生ai个BUG,问在总BUG不超过b的情况下, 我们有几种选择方法思路:看懂了题意之后 ...
- 背包DP || Codeforces 544C Writing Code
程序员写bug的故事23333 题意:n个程序员,一共写m行程序,最多产生b个bug,问方案数 思路:f[i][j]表示写了i行,产生了j个bug的方案数,因为每个人都是可以独立的,所以i循环到n都做 ...
- Codeforces Round #302 (Div. 2).C. Writing Code (dp)
C. Writing Code time limit per test 3 seconds memory limit per test 256 megabytes input standard inp ...
- Codeforces 543A Writing Code
http://codeforces.com/problemset/problem/543/A 题目大意:n个人,一共要写m行程序,每个程序员每行出现的bug数为ai,要求整个程序出现的bug数不超过b ...
- Codeforces 1197E Culture Code DP
题意:你有n个俄罗斯套娃,已知每个套娃的容积和体积,问有多少个子集满足以下条件: 1:这个子集是一个极大子集,即不能再添加其它的套娃到这个子集里. 2:子集的套娃之间的间隙和最小. 思路1:线段树优化 ...
- 完全背包 Codeforces Round #302 (Div. 2) C Writing Code
题目传送门 /* 题意:n个程序员,每个人每行写a[i]个bug,现在写m行,最多出现b个bug,问可能的方案有几个 完全背包:dp[i][j][k] 表示i个人,j行,k个bug dp[0][0][ ...
- (完全背包)Writing Code -- Codeforce 544C
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=99951#problem/C (zznu14) Writing Code Writin ...
- Codeforces Round #302 (Div. 2) C. Writing Code 简单dp
C. Writing Code Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/544/prob ...
- [CF543A]/[CF544C]Writing Code
[CF543A]/[CF544C]Writing Code 题目大意: 有\(n\)种物品,每种物品分别要\(c_i\)的代价,每个物品有\(1\)的体积,每个物品可以选多个,代价不能超过\(b\), ...
随机推荐
- 在eclipse中使用Maven建web工程项目
在eclipse中使用Maven建web工程项目: 第一种方式: 右键新建maven工程,勾选创建一个简单工程 填入信息,注意打包方式要改为war 点击完成,创建完的工程目录如下: 项目中没有WEB- ...
- Elasticsearch搜索之best_fields分析
顾名思义,best_field就是获取最佳匹配的field,另个可以通过tie_breaker来控制其他field的得分,boost可以设置权重(默认都为1). 下面从宏观上来讲的简单公式: scor ...
- 战斗逻辑 - demo
创建战斗依赖的数据结构 /** * 角色属性 */ var a_data = { _id: 101, attr: { // 角色战斗属性 }, skill: [],// 技能数组 isAtk: fal ...
- Unity Android路径及注意事项
Application.temporaryCachePath==/storage/emulated/0/Android/data/com.***.***/cache Application.persi ...
- Python13_day3
http://www.cnblogs.com/wupeiqi/articles/4950799.html`` 学习流程 一.基本的学习方法 1,看视频,听懂老师的课程. 2,下课做笔记,将笔记的内容写 ...
- IOC容器的依赖注入
1.依赖注入发生的时间 当Spring IoC容器完成了Bean定义资源的定位.载入和解析注册以后,IoC容器中已经管理类Bean定义的相关数据,但是此时IoC容器还没有对所管理的Bean进行依赖注入 ...
- 简单XSS跨站脚本攻击实验
原理:恶意Web用户将代码植入到提供给其它用户使用的页面中,如果程序没有经过过滤或者过滤敏感字符不严密就直接输出或者写入数据库.合法用户在访问这些页面的时候,程序将数据库里面的信息输出,这些恶意代码就 ...
- nginx 高可用
1 nginx负载均衡高可用 1.1 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务, ...
- 获取安卓的SH1安全码
用于获取手机联系人 信息 public static String sHA1(Context context) { try { PackageInfo info = context.getPac ...
- Shell脚本编写
1.什么是Shell脚本 Shell脚本是利用 shell 的功能所写的一个程序 program,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面, 搭配正则表达式.管 ...