AreYouBusy

题意:

给你n个工作集合,给你T的时间去做它们。给你m和s,说明这个工作集合有m件事可以做,它们是s类的工作集合(s=0,1,2,s=0说明这m件事中最少得做一件,s=1说明这m件事中最多只能做一件,s=2说明这m件事你可以做也可以不做)。再给你ci和gi代表你做这件事要用ci的时间,能获得gi的快乐值。求在T的时间内你能获得的最大快乐值。

题解:

我们设dp[i][j]表示处理完前i组工作集,所用时间小于j的快乐值
dp[i]表示的是第i组的结果,每组相对独立,
所以对于每一组情况,我们就可以将dp看作是一维数组,只考虑第二维j,考虑第一维仅为需要继承状态时
我们分析三种集合:

  1. 至少选一项。在开始时dp初始化为负无穷,这样是为了保证不会出现都不不选的情况,负无穷相当于这个情况不合法即未选
    转移方程:
dp[i][j]=max(dp[i][j],max(dp[i][j-w[x]]+p[x],dp[i-1][j-w[x]]+p[x]));

dp[i][j]表示不选这个工作
dp[i][j-w[x]]+p[x]:表示选择当前工作,且不是第一次取(为什么这个能保证不是第一次取?因为我们一开始将dp[i][…]赋值为负无穷,如果dp[i][j-w[x]]没被选过就还是负无穷,则整个式子取最大就跟他无关,如果被选过,则dp[i][j-w[x]]为正数)
dp[i-1][j-w[x]]+p[x]:第一次在本组中选物品,由于dp初始化为负无穷,所以状态的转移只能从上一组的结果中得知,这样可以保证得到全局最优解
这样,当有一组无法完成时,最后的答案就是负无穷

  1. 最多选一项,要么不选,要么就是第一次选
    为了保证全局最优解,dp[i][j]继承上一组的状态
    第一次选的话,和第一种集合的情况一样
dp[i][j]=max(dp[i][j],dp[i-1][j-w[x]]+p[x]);
  1. 任意选就是01背包
    为了保证全局最优解,dp[i][j]继承上一组的状态
dp[i][j]=max(dp[i][j],dp[i][j-w[x]]+p[x]);

这里的dp是被压缩了一维的,这里的dp[][j]中的j等于01背包的一维数组dp[j],
dp[i][]中的i只是表示第i组的情况

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;int n,m,sum;
int w[110],p[110];
int dp[110][110];int main(){//freopen("input.txt","r",stdin);while(~scanf("%d%d",&n,&sum)){memset(dp,0,sizeof(dp));int i,j,k,g;for(i=1;i<=n;i++){scanf("%d%d",&m,&g);for(k=1;k<=m;k++)scanf("%d%d",&w[k],&p[k]);if(g==0){//至少选一个 for(j=0;j<=sum;j++) //当前组初始化dp[i][j]=-INF;for(k=1;k<=m;k++)for(j=sum;j>=w[k];j--)dp[i][j]=max(dp[i][j],max(dp[i][j-w[k]]+p[k],dp[i-1][j-w[k]]+p[k]));}else if(g==1){//最多选一个 for(j=0;j<=sum;j++) //当前组初始化dp[i][j]=dp[i-1][j];for(k=1;k<=m;k++)for(j=sum;j>=w[k];j--)dp[i][j]=max(dp[i][j],dp[i-1][j-w[k]]+p[k]); //dp[i-1][j-w[k]]//j-w[k]<j}else if(g==2){//自由选择 for(j=0;j<=sum;j++) //当前组初始化dp[i][j]=dp[i-1][j];for(k=1;k<=m;k++)for(j=sum;j>=w[k];j--)dp[i][j]=max(dp[i][j],dp[i][j-w[k]]+p[k]);}}dp[n][sum]=max(dp[n][sum],-1);  //没有完成任务的值都为负的,做输出调整,输出-1printf("%d\n",dp[n][sum]);}return 0;
}

AreYouBusy相关推荐

  1. hdu 3535 AreYouBusy 经典混合背包

    借此机会,整理一下背包中的某几类问题: 物品分组,每组至少选一个: 这个时候 写法1:看别人博客,这样写省去了某些麻烦问题 达不到的dp值为-INF dp[i][j]=max(dp[i][j],max ...

  2. HDU 3535 AreYouBusy

    分析转自:http://www.cnblogs.com/jackge/archive/2013/04/22/3036374.html 链接:http://acm.hdu.edu.cn/showprob ...

  3. 0x52. 动态规划 - 背包(习题详解 × 19)

    目录 0x52. 动态规划 - 背包 0x52.1 0/10/10/1 背包 Problem A. 数字组合 Problem B. 背包问题求具体方案 Problem C. jury Compromi ...

  4. Codeforces #449 div2 C题

    C. Nephren gives a riddle time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  5. 2013-2014集训第二次个人积分赛

    地址:http://acm.hdu.edu.cn/webcontest/contest_show.php?cid=6346 密码acmore 这次比赛实在有点寒酸,11题我就弄出个最简单的题(还是找规 ...

  6. Codeforces 897C Nephren gives a riddle(DFS)

    Codeforces:Nephren gives a riddle time limit per test: 2 seconds memory limit per test: 256 megabyte ...

  7. DP分类题目 转载 《志当存高远》大神的 没有冒犯的意思 只是拿过来学习的

    A.各种背包,就根据背包九讲的内容来做吧! --不会背包的可以边看背包九讲边练习 =========================================================== ...

  8. 暑假N天乐 —— 多重+分组背包及变形

    [HDU-1114 Piggy-Bank] 完全背包裸题 http://acm.hdu.edu.cn/showproblem.php?pid=1114 一道迷路的完全背包跑到了这里来...相当于给定背 ...

  9. 背包问题常见解题策略与例题解析

    背包问题作为常见的一种Dp 题目的变法多种多样 然而只要你理解透了背包的做法和各种优化 模型就显而易见了 千万不要似懂非懂 如果还有疑虑可以参考我的另一篇文章 背包九讲--全篇详细理解与代码实现 常见 ...

最新文章

  1. java容器有哪些如何使用_Java容器有哪些?
  2. Intel DPDK包部署试验
  3. Spring batch 2.0例子(lineMapper)
  4. Neo4j--第一章
  5. Django从理论到实战(part51)--User模型
  6. fabric.js和高级画板
  7. 在JSP页面中获取系统当前日期时间
  8. 将android中如何调整Toast位置?
  9. 笔记五:python字符串
  10. 【劲峰论道时空分析技术-学习笔记】3 时空演化树
  11. 高颜值智能存储 华三魔术家M2无线云盘评测
  12. 已知分布函数求概率密度例题_助力高考:吃透数学17个必考题型,必定可以考130!(内附解题技巧+例题解析)...
  13. php shopex,shopex官网 用PHP为SHOPEX增加日志功能代码
  14. 离散信号(八)| 离散傅里叶变换DFT性质(圆周移位、圆周卷积)
  15. trader vn 显示不全_一个VNPY 的“CTP:平昨仓位不足”问题的解决记录
  16. So Who's Counting? by Erin McHugh and Emily Luchetti
  17. 安装nginx和zookeeper
  18. H264系列(7):H.264与MPEG4区别
  19. 机器学习里面的基函数_机器学习系列(一)——基础概念及分类
  20. android的wifi网卡移植详细过程已经通用驱动的问题

热门文章

  1. 日本第一赘婿!他入赘近20年拿下诺贝尔奖,成名后不忘教光棍讨老婆......
  2. 深度学习 占用gpu内存 使用率为0_深度解析MegEngine亚线性显存优化技术
  3. php中unset面试题,php unset和引用——由一道php面试题引发的思考
  4. 小学学校计算机教室使用计划,小学电脑室工作计划
  5. cent os重置mysql,linux mysql 能登陆不能修改用户(cent os 6.2)解决思路
  6. java将图片铺满panel_如何让添加的背景图片铺满整个JFrame?
  7. 大脚战场插件怎么关闭_PM工具栏插件:HonmToolBar
  8. mybatis mysql usegeneratedkeys_mybatis中useGeneratedKeys用法--插入数据库后获取主键值
  9. 长春工业大学计算机科学与技术录取分数,2021年长春工业大学各省各专业最低投档录取分数线统计(文科 理科)...
  10. 提升对前端的认知,不得不了解Web API的DOM和BOM