题目链接: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. android studio 使用问题记录

    android studio 使用问题记录 下载地址:FQ或园子内好心人提供的国内地址: http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/an ...

  2. Centos7 安装Git-cola

    首先安装Git sudo yum -y install git* 找到 git-all.noarch , 安装这个. sudo yum install git-all.noarch ========= ...

  3. 再谈Nginx Rewrite, 中文URL和其它

    上次谈到过Nginx和中文URL的问题,这几天又加深了认识. 多分享几个关于Nginx Rewrite的经验. Nginx匹配指定中文URL的方法:rewrite "(*UTF8)^x{66 ...

  4. 设置Mybatis打印调试sql的两种方式

    http://blog.csdn.net/gao36951/article/details/53641432 ********************************************* ...

  5. oracle ORA-12545:因目标主机或对象不存在

    解决方法: 1.首先从最基本的入手,这里打开计算机右击,选择管理 2. 找到里面的服务和应用程序,打开服务 3.找到: OracleOraDb11g_home1TNSListener OracleSe ...

  6. java Web监听器导图详解

    监听器是JAVA Web开发中很重要的内容,其中涉及到的知识,可以参考下面导图: Web监听器 1 什么是web监听器? web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特 ...

  7. 02 java 程序环境

    java 安装与设置 1. 安装 jdk 2. 设置执行路径 unix: set path=(/usr/local/jdk/bin $path) ( 在~/.cshrc文件里增加) linux: ex ...

  8. 集成学习AdaBoost算法——学习笔记

    集成学习 个体学习器1 个体学习器2 个体学习器3   ——> 结合模块  ——>输出(更好的) ... 个体学习器n 通常,类似求平均值,比最差的能好一些,但是会比最好的差. 集成可能提 ...

  9. Laravel5.1 文件管理

    Laravel提供了一套很好用的文件系统 方便于管理文件夹和文件,支持Amazon S3和Rackspace云存储等驱动. 1 配置 文件系统的配置文件在 config/filesyetems.php ...

  10. Laravel5.1 表单验证

    当我们提交表单时 通常会对提交过来的数据进行一些验证.Laravel在Controller类中使用了一个traint:ValidatesRequest.方便我们在控制器中使用验证器. 下面我们就来看一 ...