题目链接: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. CYQ学习主要摘要2

    数据库配置假设如下: <connectionStrings>         <add name="Conn" connectionString="Se ...

  2. 算法5-6:Kd树

    问题 给定一系列的点.和一个矩形.求矩形中包括的点的数量. 解答 这个问题能够通过建立矩阵来进行求解.首先将一个空间切割成矩阵,将点放置在相应的格子中.再计算矩形覆盖的格子.再推断格子中的点是否包括在 ...

  3. angular学习疑问总结

    服务里返回的数据是不是只能传给控制器,而不能传给指令呢?如果是的话那么指令只能通过配置scope属性来访问控制器里的数据

  4. Android Bitmap和Canvas学习笔记

    位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的. 1. 从资源中获取位图 可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图. 当然,首先需要获 ...

  5. RFID Hacking–资源大合集

    原文: http://www.freebuf.com/news/others/605.html http://www.proxmark.org/forum/index.php RFID破解神器官方论坛 ...

  6. 基于jQuery仿淘宝产品图片放大镜代码

    今天给大家分享一款 基于jQuery淘宝产品图片放大镜代码.这是一款基于jquery.imagezoom插件实现的jQuery放大镜.适用浏览器:IE8.360.FireFox.Chrome.Safa ...

  7. RIP动态路由的配置

    RIP其实相对比会比静态路由会简单的多,只需要使用rip命令添加邻居的网络号即可. 命令: Router(config)#ip route rip Router(config-router)#netw ...

  8. Android Studio运行程序,检测不到(夜神、Genymotion)模拟器

    用了统一给的android studio,运行程序,检测不到模拟器(夜神). 又新建了一个系统的模拟器,运行,提示ANDROID_SDK_ROOT is undefined 在环境变量中配置之后,夜神 ...

  9. Linux下清空缓冲区的方法

    Linux下清空缓冲区的方法 C标准规定fflush()函数是用来刷新输出(stdout)缓存的.对于输入(stdin),它是没有定义的.但是有些编译器也定义了fflush( stdin )的实现,比 ...

  10. Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解<转>

    简介: handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型) A.处理requet uri 部分(这里指uri templat ...