HDU 3535 AreYouBusy (混合背包之分组背包)
Problem Description
Happy New Term!
As having become a junior, xiaoA recognizes that there is not much time for her to AC problems, because there are some other things for her to do, which makes her nearly mad.
What's more, her boss tells her that for some sets of duties, she must choose at least one job to do, but for some sets of things, she can only choose at most one to do, which is meaningless to the boss. And for others, she can do of her will. We just define the things that she can choose as "jobs". A job takes time , and gives xiaoA some points of happiness (which means that she is always willing to do the jobs).So can you choose the best sets of them to give her the maximum points of happiness and also to be a good junior(which means that she should follow the boss's advice)?
Input
There are several test cases, each test case begins with two integers n and T (0<=n,T<=100) , n sets of jobs for you to choose and T minutes for her to do them. Follows are n sets of description, each of which starts with two integers m and s (0<m<=100), there are m jobs in this set , and the set type is s, (0 stands for the sets that should choose at least 1 job to do, 1 for the sets that should choose at most 1 , and 2 for the one you can choose freely).then m pairs of integers ci,gi follows (0<=ci,gi<=100), means the ith job cost ci minutes to finish and gi points of happiness can be gained by finishing it. One job can be done only once.
Output
One line for each test case contains the maximum points of happiness we can choose from all jobs .if she can’t finish what her boss want, just output -1 .
Sample Input
3 3
2 1
2 5
3 8
2 0
1 0
2 1
3 2
4 3
2 1
1 1
3 4
2 1
2 5
3 8
2 0
1 1
2 8
3 2
4 4
2 1
1 1
1 1
1 0
2 1
5 3
2 0
1 0
2 1
2 0
2 2
1 1
2 0
3 2
2 1
2 1
1 5
2 8
3 2
3 8
4 9
5 10
Sample Output
5
13
-1
-1
分析:
题目大意:有 n 组任务,T 个体力,每组任务有 m 个,分类为 type,每个任务花费 cose[] 体力,得到 value[] 的开心值,求最大开心值,若不能完成输出-1
分类为 0:这一组中的 m 个任务至少选择一个。
分类为 1:这一组中的 m 个任务最多选择一个。
分类为 2:这一组中的 m 个任务随便选择。
定义:dp[i][k]:完成第 i 组任务时,体力为 k 时获得的开心值。
1.对于分类 0,若当前判断到一个任务 case,则有两种情况:
(1)它是该组第一个被选择的任务,则它更新的状态只能是将上一层的状态转移更新到当前位置。
dp[i][k]=max(dp[i][k],dp[i-1][k-cost[j]]+value[j]);
(2)它不是第一个被选择的任务,则它可以由当前组的状态转移更新到当前位置。
dp[i][k]=max(dp[i][k],dp[i][k-cost[j]]+value[j]);
为了方便判断处理第一个任务,初始化当前层为 -inf
2.对于分类 1,因为只能选一个或者不选,则它只能由上一层状态转移更新。
dp[i][k]=max(dp[i][k],dp[i-1][k-cost[j]]+value[j]);
3.对于分类 2,就是普通的 01背包问题
肯定是要从上层的转移过来:dp[i][k]=max(dp[i][k],dp[i-1][k-cost[j]]+value[j]);
但是还需要考虑到一点就是说,这个组里面的任务可以选取任意多的个数:
dp[i][k]=max(dp[i][k],dp[i][k-cost[j]]+value[j]);
代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
const long long N=200;
using namespace std;
const int inf=0x3f3f3f3f;
int dp[N][N];
int n,T;
int cost[N],value[N];
int main()
{
while(~scanf("%d%d",&n,&T))
{
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++)
{
int m,type;
scanf("%d%d",&m,&type);
for(int j=1; j<=m; j++)
scanf("%d%d",&cost[j],&value[j]);
if(type==0)//最少选择一个工作
{
for(int j=0; j<=T; j++)
dp[i][j]=-inf;//方便处理第一个任务,初始化为-inf
for(int j=1; j<=m; j++)
for(int k=T; k>=cost[j]; k--)
{
dp[i][k]=max(dp[i][k],dp[i][k-cost[j]]+value[j]);//不是改组中第一个任务,从改组中的其他任务更新来
dp[i][k]=max(dp[i][k],dp[i-1][k-cost[j]]+value[j]);//如果是改组中第一个被选择的任务,在从上一组更新来
}
}
else if(type==1)//选择一个或不选
{
for(int j=0; j<=T; j++)
dp[i][j]=dp[i-1][j];//只能由上一层的状态转移来
for(int j=1; j<=m; j++)
for(int k=T; k>=cost[j]; k--)
{
dp[i][k]=max(dp[i][k],dp[i-1][k-cost[j]]+value[j]);
}
}
else//可以任意的选择
{
for(int j=0; j<=T; j++)
dp[i][j]=dp[i-1][j];//从上一层转移过来
for(int j=1; j<=m; j++)
for(int k=T; k>=cost[j]; k--)
{
dp[i][k]=max(dp[i][k],dp[i][k-cost[j]]+value[j]);//由因为每组内的任务可以多选
dp[i][k]=max(dp[i][k],dp[i-1][k-cost[j]]+value[j]);//直接转移上一层的
}
}
}
dp[n][T]=max(dp[n][T],-1);
printf("%d\n",dp[n][T]);
}
return 0;
}
HDU 3535 AreYouBusy (混合背包之分组背包)的更多相关文章
- HDU 3535 AreYouBusy(混合背包)
HDU3535 AreYouBusy(混合背包) http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意: 给你n个工作集合,给你T的时间去做它们.给你m和 ...
- hdu 3535 AreYouBusy 分组背包
AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- [HDU 3535] AreYouBusy (动态规划 混合背包 值得做很多遍)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n个任务集合,需要在T个时间单位内完成.每个任务集合有属性,属性为0的代表至少要完成1个 ...
- HDU 1712 ACboy needs your help (分组背包模版题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712 有n门课,和m天时间.每门课上不同的天数有不同的价值,但是上过这门课后不能再上了,求m天里的最大 ...
- 【HDU】I love sneakers!(分组背包)
看了许多的题解,都有题目翻译,很不错,以后我也这样写.直接翻译样例: /*鞋子的数量N[1, 100]; 拥有的金钱M[1, 1w]; 品牌数目[1, 10]*/ /*以下四行是对于每双鞋的描述*/ ...
- 【HDU - 4341】Gold miner(分组背包)
BUPT2017 wintertraining(15) #8B 题意 给出每个黄金的坐标.价值及耗时,同一方向的黄金只能依次取,求T时间内收获的最大值. 题解 同一方向,物品前缀和构成的组合,相当于是 ...
- 洛谷 P1757 通天之分组背包 【分组背包】
题目链接:https://www.luogu.org/problemnew/show/P1757#sub 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包 ...
- HDU 3535 AreYouBusy (混合背包)
题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...
- HDU 3535 AreYouBusy 经典混合背包
AreYouBusy Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Su ...
随机推荐
- 【高级】PHP-FPM和Nginx的通信机制
PHP-FPM 介绍 CGI 协议与 FastCGI 协议 每种动态语言( PHP,Python 等)的代码文件需要通过对应的解析器才能被服务器识别,而 CGI 协议就是用来使解释器与服务器可以互相通 ...
- DataTable List 相互转换
This uses the FastMember's meta-programming API for maximum performance. If you want to restrict it ...
- ajax极简教程
一.什么是ajax ajax即异步JavaScript和XML,它是一种用于创建快速动态网页的技术.作用是通过在后台与服务器进行少量数据交换,使网页实现异步更新.这意味着可以在不重新加载整个网页的情况 ...
- springmvc+mybatis 处理图片(二):显示图片
数据库及配置文件等参考:springmvc+mybatis 处理图片(一):上传图片思路:把图片二进制信息写入到HttpServletResponse 的outputStream输出流中来显示图片.一 ...
- web接口测试中需要测试的几个点
本文导读: web接口测试用例要包括欲测试的功能.应输入的数据和预期的输出结果,只有在数据能正确流入.流出模块的前提下,其他测试才有意义.下面介绍在web测试接口时一些需要注意的点 1.接口返回 数据 ...
- STL stack 容器
STL stack 容器 Stack简介 stack是堆栈容器,是一种“先进后出”的容器. stack是简单地装饰deque容器而成为另外的一种容器. #include <s ...
- 3.11 - 3.12 A day with Google
补了一番游记. 找了一个本科学弟一起去上海游玩.本来老板还要我周一过去讨论寒假阅读的论文,总算是把讨论时间挪到周六了. 兴冲冲地买好车票后就开始期待上海Google office的神秘之旅. upda ...
- [CF850F] Rainbow Balls
题目大意 这里 题解 我们枚举最后剩下的球的种类,那么其他球可以看做没用了. 设选定的球有\(a_i\)个,球的总数为\(s=\sum_{i=1}^n a_i\). 现在问题变为:在一个长度为\(s\ ...
- Alpha 完结撒花 —— 事后诸葛亮
写在前面 林燊大哥 一路走来,好不容易,终于完结了. 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决的问题 用户在进店之前无法得知店铺的优劣,通过 ...
- 美团codeM之美团代金券
前天做了下美团的一个codeM比赛的资格赛,遇到一个题目挺有意思的,所以现在做一下总结. 题目描述 美团的每一个用户都有一个用户代金券的消费记录日志,每位用户都能购买若干种代金券,但是每一种代金券最多 ...