题目链接: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的更多相关文章

  1. HDU3535 AreYouBusy 混合背包

    题目大意 给出几组物品的体积和价值,每组分为三种:0.组内物品至少选一个:1.组内物品最多选一个:2.组内物品任意选.给出背包容量,求所能得到的最大价值. 注意 仔细审题,把样例好好看完了再答题,否则 ...

  2. HDU 3535 AreYouBusy(混合背包)

    HDU3535 AreYouBusy(混合背包) http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意: 给你n个工作集合,给你T的时间去做它们.给你m和 ...

  3. hdu3535(AreYouBusy)

    题目链接:传送门 题目大意:有 n 组任务,m 个体力,每组任务有 k 个,分类为 f,每个任务花费 x 体力,得到 y 开心值,求最大开心值,若不能完成输出-1 分类为 0:这一组中的 k 个任务至 ...

  4. AreYouBusy

    AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  5. hdu 3535 AreYouBusy 分组背包

    AreYouBusy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

  6. HDU 3535 AreYouBusy 经典混合背包

    AreYouBusy Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Su ...

  7. AreYouBusy HDU - 3535 (dp)

    AreYouBusy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. hdu3535题解

    hdu3535:http://acm.hdu.edu.cn/showproblem.php?pid=3535 该题是非常全面的一道分组背包问题.其实理解了最多一个的分组背包问题,解题起来也是很简单的. ...

  9. HDU 3535 AreYouBusy (混合背包)

    题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...

随机推荐

  1. [转]软件测试 Top 120 Blog (博客)

    [转]软件测试 Top 120 Blog (博客) 2015-06-08 转自:    软件测试 Top 120 Blog (博客) # Site Author Memo DevelopSense M ...

  2. Python 元祖的操作

    注意:元祖定义后不可修改,单个元祖后面必须加逗号,否则认为是字符串:tuple = ('apple',) 1.定义元祖 tuple = ('apple','banana','grape','orang ...

  3. Windows Phone 解析手机型号DeviceStatus.DeviceName

    问题的产生 在WP开发过程中难免遇到统计等相关的数据回收,那么当使用DeviceStatus.DeviceName这个来获取设备的名称时经常会得到类似下面的设备信息:     可以看出这样的数据很不直 ...

  4. [dts]TI-am437x dts

    imx6 可以参考http://blog.csdn.net/shengzhadon/article/details/49908439 参照文件: Documentation/devicetree/bi ...

  5. 使用jsonp处理跨域问题

    调用web接口,get请求,发现提示:No 'Access-Control-Allow-Origin' header is present on the requested resource. 这个和 ...

  6. Spring整合activiti单元测试

    ** * Spring测试activiti配置是否正常 * <p>Title: SpringActivitiTest</p> * <p>Description: & ...

  7. php -- php缓存技术

    为了尽量减少不必要的数据库查询,我对一些数据进行了缓存和静态化处理. 缓存的原理:把一些经常要用到但又很少改动的数据以数组或其它形式存储到一个独立的PHP文件中,然后在需要用到的时候包含进来. 缓存的 ...

  8. php -- PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而不是通过浏览器直接打开下载的文件

    之前做项目遇到这样一个问题,就是在php环境下,用a标签的href链接到一个资源,比如是mp3或者lrc文件时,点击之后不是出现保存文件的提示,而是调用本地程序打开文件或者直接在浏览器上解析.网上说可 ...

  9. OEM无法启动:oracle/product/10.2.0/dbhome_1/oc4j/j2ee/OC4J_DBConsole_localhost.localdomain_orcl not found.

    配置OEM环境变量 ORACLE_UNQNAME=$ORACLE_SID 要想打开OEM的web管理程序,必须先启动Database listener,再启动Datebase Control端口监控程 ...

  10. 怎么用MathType解决Word公式排版很乱的问题

    现在办公室起草文件,期刊论文投稿.学校试着编辑都要先在Word中编辑好后再打印出来.在Word中编辑这些文本内容时,如果遇到公式就要使用专门的MathType公式编辑器.而有很多人在用MathType ...