HDU3535——AreYouBusy
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535
题目意思:给出两个数n,T,分别表示有n个任务集合,T的总时间,对于每个任务集合有两个属性m和type,表示这个任务集合内有m个任务,类型为type,当type=0的时候必须执行一个这个集合内的一个任务,type=1的时候最多可以执行一项,type=2随便你做不做。
思路:不愧是10年多校的题,看到的时候真的是懵逼了。颠覆了对背包的看法,但是这个题肯定是一个混合背包(这个还是看出来了)!首先要想一个框架来涵盖所有的情况,我们可以建立二维dp数组dp[i][j]来表示有i个任务集合时剩余j的时间。
对于type=0的时候:
由于至少选一项类比另一背包的思想,从前一个任务集合那里转移过来,也可以从自己这里转移过来(选择多个),但是数组要设置成-inf来判断来判断是否可以从上一组任务集合里转移过来判断是否取了这个这个集合里的任务。
转移方程:dp[i][k]=max(dp[i][k],dp[i][k-co[j]]+ha[j],dp[i-1][k-co[j]]+ha[j]);
对于type=1的时候:
这个时候可选可不选了,直接复制上一组的内容然后。由于最多选一个所以只能从上一个任务集合转移过来。
转移方程: dp[i][k]=max(dp[i][k],dp[i-1][k-co[j]]+ha[j]);
对于type=2的时候:
这个时候也是可选可不选,直接复制上一组内容然后,由于可多选,所以可以从上一个任务转移集合转移过来,也可以的时候从自己转移过来。
转移方程:dp[i][k]=max(dp[i][k],dp[i][k-co[j]]+ha[j],dp[i-1][k-co[j]]+ha[j]);
个人认为比较难的地方:必须要选一个情况。这是我看了题解才想懂的地方,这是一道好题以后要多复习复习。
总结:对于是否选一个可以把数组全部设置成-inf,看是否可以从上一个任务哪里转移,以判断是否选择了。
代码:
//Author: xiaowuga
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <map>
#include <bitset>
#include <cctype>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define mem(s,ch) memset(s,ch,sizeof(s))
#define nc cout<<"nc"<<endl
#define sp " "
const long long N=;
using namespace std;
typedef long long LL;
typedef int II;
II dp[N][N];
II n,T;
II co[N],ha[N];
int main() {
ios::sync_with_stdio(false);cin.tie();
while(cin>>n>>T){
mem(dp,);
for(int i=;i<=n;i++){
int m,type;
cin>>m>>type;
for(int j=;j<=m;j++) cin>>co[j]>>ha[j];
if(type==){
for(int j=;j<=T;j++) dp[i][j]=-inf;
for(int j=;j<=m;j++)
for(int k=T;k>=co[j];k--){
dp[i][k]=max(dp[i][k],dp[i][k-co[j]]+ha[j]);
dp[i][k]=max(dp[i][k],dp[i-][k-co[j]]+ha[j]);
}
}
else if(type==){
for(int j=;j<=T;j++) dp[i][j]=dp[i-][j];
for(int j=;j<=m;j++)
for(int k=T;k>=co[j];k--){
dp[i][k]=max(dp[i][k],dp[i-][k-co[j]]+ha[j]);
}
}
else{
for(int j=;j<=T;j++) dp[i][j]=dp[i-][j];
for(int j=;j<=m;j++)
for(int k=T;k>=co[j];k--){
dp[i][k]=max(dp[i][k],dp[i][k-co[j]]+ha[j]);
dp[i][k]=max(dp[i][k],dp[i-][k-co[j]]+ha[j]);
}
}
}
dp[n][T]=max(dp[n][T],-);
cout<<dp[n][T]<<endl;
}
return ;
}
HDU3535——AreYouBusy的更多相关文章
- HDU3535 AreYouBusy 混合背包
题目大意 给出几组物品的体积和价值,每组分为三种:0.组内物品至少选一个:1.组内物品最多选一个:2.组内物品任意选.给出背包容量,求所能得到的最大价值. 注意 仔细审题,把样例好好看完了再答题,否则 ...
- HDU 3535 AreYouBusy(混合背包)
HDU3535 AreYouBusy(混合背包) http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意: 给你n个工作集合,给你T的时间去做它们.给你m和 ...
- hdu3535(AreYouBusy)
题目链接:传送门 题目大意:有 n 组任务,m 个体力,每组任务有 k 个,分类为 f,每个任务花费 x 体力,得到 y 开心值,求最大开心值,若不能完成输出-1 分类为 0:这一组中的 k 个任务至 ...
- AreYouBusy
AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 3535 AreYouBusy 分组背包
AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- HDU 3535 AreYouBusy 经典混合背包
AreYouBusy Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Su ...
- AreYouBusy HDU - 3535 (dp)
AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu3535题解
hdu3535:http://acm.hdu.edu.cn/showproblem.php?pid=3535 该题是非常全面的一道分组背包问题.其实理解了最多一个的分组背包问题,解题起来也是很简单的. ...
- HDU 3535 AreYouBusy (混合背包)
题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...
随机推荐
- cocos2d-x 2.0通过CCAnimation实例获取CCSpriteFrame
通过CCAnimation实例获取CCSpriteFrame,会出现类型转换问题.我们在创建一个animation的时候,经常遵循下面的步骤:1)create 一个CCArray对象A.2)通过A-& ...
- struts2设置加载非默认路径的struts.xml文件解决方案
方案一: 首先我们要明白struts2加载配置文件都是从它自己的jar包和\WEB-INF\classes两个默认的位置加载的,如果你想改变strusts2中的文件的默认加载路径,可以在web项目 ...
- JAVA-Word转PDF各种版本实现方式
当下做一个项目,就是各种操作office,客户的需求总是各种不按常理,来需求就得搞啊.对JAVA操作office这方面真是头大,弟弟是真滴不懂不会啊.无奈只好试啊试的.网上一大堆好使的,一大堆不好使的 ...
- form之action的绝对路径与相对路径
1.当你的form要提交到你自己的站点之外的URL的时候,就采取绝对路径: <form action="http://www.xxx.yyy:zzzz/mmm/nn/kkk.jsp&q ...
- love2d--glsl03噪声
由于一些glsl的教程都是3d的,而love是2d的,所以之后以示例为主,我会收集 一些love的shader,分类讲解. 此文简译自love2d社区博客,这里略去作者的自我介绍. 像素着色器入门 示 ...
- Memcached内存分配及使用问题
在启动memcached的时候可以加-f参数和-n参数.-f指定各slab里面chunk大小的变化比例,默认1.25,-n指定slab里面chunk大小从多少开始.使用memcache_add($me ...
- _BV()
#define _BV(bit) (1 << (bit)) _BV()是把1左移N位的函数._BV(7)相当于(1<<7) 常用于位的置位或清零 示例解析: PC7=7; PO ...
- [JS] jquery控件基本要点备份
(1)CDN Google CDN:<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min. ...
- python中的列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, ...
- 学习:java代码检测
转自:http://zh.wikipedia.org/wiki/%E4%BB%A3%E7%A0%81%E5%BC%82%E5%91%B3 对于Java开发语言,有些工具,比如Checkstyle.PM ...