http://codeforces.com/contest/543/problem/A

一开始这题用了多重背包做,结果有后效性。

就是如果6,这样拆分成

1 + 2 + 3的,那么能产生3的就有两种情况了(同一种物品,两种情况,所以有了后效性)

分别是1 + 2 = 3和0 + 3 = 3

以前的多重背包只需要输出那些最优解,所以这个后效性可以忽略,但是现在是输出方案种类,所以不能忽视。

一开始的时候还以为他只能写b / per_bug个,因为最多b个bug,每个程序员写per_bug个。那么就是b / per_bug行。

所以觉得是多重背包。但是不是,第一,这里没限制它写多少行,确实是最多b / per_bug行,但是如果多了几行,也就是超过了背包容量,这其实和无限使用时一个意思的。

多重背包的都是最多能用c个,而且用了c + 1 个的话,还是没超过背包容量的,这才是多重背包。。

那么这么想,任何一个programmer,都可以写0...m行。

因为它能写m行,而这个m已经是背包容量的最大值了。所以就相当于完全背包了。

如果再选多个容量就超过了背包容量,那不会叠加上来的。这是完全背包的思想吧

那么设dp[m][b]表示前i个程序员,一共写了m行,有b个bug的情况。

对于每个程序员,都可以写0...m行,dp[m][b] += dp[m - 1][b - cost];

从自己写的m - 1行递推上来,就相当于写了m行了。

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <assert.h>
  7. #define IOS ios::sync_with_stdio(false)
  8. using namespace std;
  9. #define inf (0x3f3f3f3f)
  10. typedef long long int LL;
  11.  
  12. #include <iostream>
  13. #include <sstream>
  14. #include <vector>
  15. #include <set>
  16. #include <map>
  17. #include <queue>
  18. #include <string>
  19. #include <conio.h>
  20. const int maxn = + ;
  21. struct node {
  22. int hang;
  23. int bug;
  24. node(int hh, int bb) : hang(hh), bug(bb) {}
  25. node() {}
  26. }a[maxn];
  27. int w[maxn];
  28. int val[maxn];
  29. int dp[maxn][maxn];
  30. void work() {
  31. int n, m, b, MOD;
  32. scanf("%d%d%d%d", &n, &m, &b, &MOD);
  33. for (int i = ; i <= n; ++i) {
  34. scanf("%d", &w[i]);
  35. }
  36. dp[][] = ;
  37. for (int i = ; i <= n; ++i) {
  38. for (int j = ; j <= m; ++j) {
  39. // if (j * w[i] > b) break;
  40. for (int k = w[i]; k <= b; ++k) {
  41. dp[j][k] += dp[j - ][k - w[i]];
  42. if (dp[j][k] >= MOD) dp[j][k] %= MOD;
  43. }
  44. }
  45. }
  46. int ans = ;
  47. for (int i = ; i <= b; ++i) {
  48. ans += dp[m][i];
  49. if (ans >= MOD) ans %= MOD;
  50. }
  51. printf("%d\n", ans);
  52. }
  53.  
  54. int main() {
  55. #ifdef local
  56. freopen("data.txt", "r", stdin);
  57. // freopen("data.txt", "w", stdout);
  58. #endif
  59. work();
  60. return ;
  61. }

A. Writing Code 完全背包的更多相关文章

  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][ ...

  2. (完全背包)Writing Code -- Codeforce 544C

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=99951#problem/C  (zznu14) Writing Code  Writin ...

  3. [CF543A]/[CF544C]Writing Code

    [CF543A]/[CF544C]Writing Code 题目大意: 有\(n\)种物品,每种物品分别要\(c_i\)的代价,每个物品有\(1\)的体积,每个物品可以选多个,代价不能超过\(b\), ...

  4. 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 ...

  5. 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 ...

  6. CodeForces 543A - Writing Code DP 完全背包

    有n个程序,这n个程序运作产生m行代码,但是每个程序产生的BUG总和不能超过b, 给出每个程序产生的代码,每行会产生ai个BUG,问在总BUG不超过b的情况下, 我们有几种选择方法思路:看懂了题意之后 ...

  7. CodeForces 544C (Writing Code)(dp,完全背包)

    题意:有n个程序员,要协作写完m行代码,最多出现b个bug,第i个程序员每写一行代码就会产生a[i]个bug,现在问,这n个人合作来写完这m行代码,有几种方案使得出的bug总数不超过b(题中要求总方案 ...

  8. 背包DP || Codeforces 544C Writing Code

    程序员写bug的故事23333 题意:n个程序员,一共写m行程序,最多产生b个bug,问方案数 思路:f[i][j]表示写了i行,产生了j个bug的方案数,因为每个人都是可以独立的,所以i循环到n都做 ...

  9. CF543A Writing Code

    题目描述 Programmers working on a large project have just received a task to write exactly m m m lines o ...

随机推荐

  1. 黑马程序员_ Objective-c 之Foundation笔记(一)

    结构体  NSRange: 用来表示范围 创建 NSRange r1 = {2, 4} NSRange r2 = {.location = 2, .length = 4} NSRange r3 = N ...

  2. Spring MVC基本配置@controller和@RequestMapping解释

    一:配置web.xml 1)问题:spring项目中有多个配置文件mvc.xml   dao.xml 2)解决:在web.xml中 <init-param> <param-name& ...

  3. spark1.3编译过程中遇到的一个坑

    在编译spark1.3.0时: export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m&q ...

  4. OpenGL ES(一.概念)

    OpenGL ES是以手持和嵌入式设备为目标的高级3D图形应用程序编程接口,主要的支持平台是iOS,Android,Linux和Windows 1.顶点着色器 他可以用于通过矩阵变换位置,计算照明公式 ...

  5. 在大于32GB或64GB容量的SD卡上使用NOOB安装树莓派 - Using NOOB on SD cards larger than 32GB or 64GB for Raspberry Pi

    在树莓派上玩了一小段时间了,因为装的软件包越来越多,所以越来越感觉16G的SD卡没办法长期使用下去.于是采购了几张64G的SD卡,打算周末装上系统.可是按照一般的流程,在Windows下用SD For ...

  6. Oracle11g导出空表

    # Oracle11g导出空表 <!-- create time: 2015-06-01 23:35:24 --> ###原因 11G中有个新特性,当表无数据时,不分配`segment`, ...

  7. 基于mini2440的uboot移植(一)

    一.移植环境 虚拟机:ubuntu12.04 uboot源码:u-boot-2008.10.tar.bz2 交叉编译:arm-linux-gcc-4.4.3 简单的记录下编译uboot的过程,要想具体 ...

  8. JPush API client library for C Sharp(极光推送API)

    概述 这是 JPush REST API 的 C# 版本封装开发包,是由极光推送官方提供的,一般支持最新的 API 功能. 对应的 REST API 文档:http://docs.jpush.io/s ...

  9. tomcat虚拟目录映射网络共享目录

    <Host name="localhost" debug="0" appBase="webapps" unpackWARs=" ...

  10. PHP常用函数大全

    usleep() 函数延迟代码执行若干微秒.unpack() 函数从二进制字符串对数据进行解包.uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.time_sleep_until() ...