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 ...
随机推荐
- [转帖]AMD、英特尔为何争相走向胶水多核处理器?真相在此
AMD.英特尔为何争相走向胶水多核处理器?真相在此 胶水多核到底好不好?这个事不是简单一句话能说明的,今天的超能课堂里我们就来聊聊MCM胶水多核技术的过去及未来. 作者:孟宪瑞来源:超能网|2018- ...
- PHP导出sql文件
发现自己之前写的php导出sql数据为Excel文件在导出一些数据的时候出现了精度的问题,比如导出身份证号的时候会把后面变成0000.暂时先把这个问题留下,有空去看看到底是什么问题. 写了一个导出sq ...
- DotNetty 跨平台的网络通信库
长久以来,.Net开发人员都非常羡慕Java有Netty这样,高效,稳定又易用的网络通信基础框架.终于微软的Azure团队,使用C#实现的Netty的版本发布.不但使用了C#和.Net平台的技术特点, ...
- 【算法】—— 1到n中减少了一个数,顺序被打乱,找出缺失的数
问题 有0-n这n+1个数,但是其中丢了一个数,请问如何找出丢了哪个数? 五种方法 1)用1+2+...+n减去当前输入数据的总和.时间复杂度:O(n) 空间复杂度:O(1) [容易溢出] 2)用12 ...
- POJ1815_Friendship
一个无向图,问你删除多少点后,可以隔断起点到终点的所有路径?输出字典序最小的删点方案. 求最小点割,先拆点,容量为1,普通边容量无穷,最大流即为应删点数. 需要求出字典序最小的方案,可以从小到大枚举所 ...
- spring通过工厂模式解决页面耦合问题
spring通过工厂模式解决页面耦合问题
- 牛客OI赛制测试赛3 解题报告
前话: 话说考试描述:普及难度. 于是想在这场比赛上涨点信心. 考出来的结果:Point:480 Rank:40 然而同机房的最好成绩是 510. 没考好啊!有点炸心态,D题一些细节没有注意, ...
- MT【142】Bachet 问题,进位制
问题: 满足下面两种限制条件下要想称出40以内的任何整数重量,最少要几个砝码: i)如果砝码只能在天平的某一边; ii)如果砝码可以放在天平的两边. 提示:对于 i)先证明如下事实: \[\textb ...
- Linux中的防火墙----iptables
防火墙,它是一种位于内部网络与外部网络之间的网络安全系统.一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过. 防火墙根据主要的功能可分为网络层防火墙.应用层防火墙.数据库防火墙. 网 ...
- Hive权限管理
最近遇到一个hive权限的问题,先简单记录一下,目前自己的理解不一定对,后续根据自己的理解程度更新 一.hive用户的概念 hive本身没有创建用户的命令,hive的用户就是Linux用户,若当前是用 ...