// 混合背包
// xiaoA想尽量多花时间做ACM,但老板要求他在T时间内做完n堆工作,每个工作耗时ac[i][j],
// 幸福感ag[i][j],每堆工作有m[i]个工作,每堆工作都有一个性质,
// 0表示至少要做里面的1个工作,
// 1表示最多做里面的1个工作,
// 2表示随意,做或不做都行。最后问在符合老板要求的情况下的最大幸福感,怎么都不符合要求就输出-1. // 0 可以看 hdu 3033 I love sneakers!
// 1,2 情况就是普通背包了 #include <iostream>
#include <algorithm>
#include <queue>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MOD 1000000007
#define maxn 110
int dp[maxn],dp_num[maxn],dpy[maxn];
int ac[maxn][maxn],ag[maxn][maxn];
int zero[maxn],one[maxn],two[maxn];
int main()
{
int n,T;
int m[maxn],s;
int num0,num1,num2;
int i,j,k;
while(scanf("%d %d",&n,&T)!=EOF){
num0=num1=num2=;
for(i=;i<=n;i++){
scanf("%d %d",&m[i],&s);
switch(s)
{
case :zero[num0++]=i;break;
case :one[num1++]=i;break;
case :two[num2++]=i;break;
}
for(j=;j<=m[i];j++)
scanf("%d %d",&ac[i][j],&ag[i][j]);
}
int num;
memset(dp,,sizeof(dp));
memset(dp_num,,sizeof(dp_num));
memset(dpy,,sizeof(dpy));
for(num=;num<num0;num++)
{
i=zero[num];
for(j=;j<=m[i];j++){
for(k=T;k>=ac[i][j];k--){
if(dpy[k]<dp[k-ac[i][j]]+ag[i][j]&&dp_num[k-ac[i][j]]>=num){
dpy[k]=dp[k-ac[i][j]]+ag[i][j];
dp_num[k]=num+;
} else if(dp_num[k]==num&&dp_num[k-ac[i][j]]==num){
dpy[k]=dp[k-ac[i][j]]+ag[i][j];
dp_num[k]=num+;
}
}
for(k=;k<=T;k++)
if(dpy[k]>dp[k])
dp[k]=dpy[k];
}
for(j=;j<=T;j++)
dp[j]=dpy[j];
}
num=;
for(j=;j<=T;j++)
if(dp_num[j]!=num0)
dpy[j]=dp[j]=-,num++;
// else
// printf("\n%d %d ]",j,dp[j]); if(num==T+){printf("-1\n");continue;}//
for(num=;num<num1;num++)
{
i=one[num];
for(j=;j<=m[i];j++)
for(k=T;k>=ac[i][j];k--)
if(dp[k-ac[i][j]]>-)
dpy[k]=max(dpy[k],dp[k-ac[i][j]]+ag[i][j]);
for(j=;j<=T;j++)
dp[j]=dpy[j];
}
// for(i=0;i<=T;i++) printf("\n %d %d ]",i,dpy[i]);
for(num=;num<num2;num++)
{
i=two[num];
for(j=;j<=m[i];j++)
for(k=T;k>=ac[i][j];k--)
if(dp[k-ac[i][j]]>-)
dp[k]=max(dp[k],dp[k-ac[i][j]]+ag[i][j]);
}
printf("%d\n",dp[T]);
} return ;
}

hdu 3535 AreYouBusy的更多相关文章

  1. HDU 3535 AreYouBusy(混合背包)

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

  2. hdu 3535 AreYouBusy 分组背包

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

  3. [HDU 3535] AreYouBusy (动态规划 混合背包 值得做很多遍)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n个任务集合,需要在T个时间单位内完成.每个任务集合有属性,属性为0的代表至少要完成1个 ...

  4. HDU 3535 AreYouBusy 经典混合背包

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

  5. HDU 3535 AreYouBusy (混合背包)

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

  6. HDU 3535 AreYouBusy (混合背包之分组背包)

    题目链接 Problem Description Happy New Term! As having become a junior, xiaoA recognizes that there is n ...

  7. AreYouBusy HDU - 3535 (dp)

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

  8. HDU - 3535:AreYouBusy (分组背包)

    题意:给你n个工作集合,给你T的时间去做它们.给你m和s,说明这个工作集合有m件事可以做,它们是s类的工作集合(s=0,1,2,s=0说明这m件事中最少得做一件,s=1说明这m件事中最多只能做一件,s ...

  9. HDU 3535 分组混合背包

    http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n组工作,T时间,每个工作组中有m个工作,改组分类是s,s是0是组内至少要做一件,是1时最多做一件 ...

随机推荐

  1. C++中的mutable关键字

    mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远 ...

  2. 请求--拦截器--action经过

    引用我这里想知道的是同名的多个参数,会被自动的放置在List或者数组中,我想知道是怎么实现的,因为取一个参数和取多个同名的参数是不同的方法: 一个是request.getParameter 一个是re ...

  3. jquery div层级选择器

    div id="modelName" class="modelName"> <!-- 车系的层 --> <div name=" ...

  4. Using command-line Subversion to access project source files

    Help index About source code version control with Software Configuration Management (Subversion) Usi ...

  5. 在IDEA上用python来连接集群上的hive

    1.在使用Python连接hive之前需要将hive中的文件拷贝到自己创建python项目中 cp -r apache-hive--bin/lib/py  /home/jia/Desktop 2.把h ...

  6. hadoop:could only be replicated to 0 nodes, instead of 1

    在Hadoop的环境搭建过程中,常常会遇到类似这样的错误信息提示:“could only be replicated to 0 nodes, instead of 1 ”,产生这样的错误原因有多种,这 ...

  7. TopCoder 603 div1 & div2

    div2 250pts MiddleCode 题意:s串长度为奇数时,将中间字符取掉并添加到t末尾:长度为偶数时,将中间两个较小的字符取掉并添加到末尾. 分析:直接做,学习了一下substr(s, p ...

  8. 【转】 wget 命令用法详解

    wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能和特点:(1)支持断点下传功能:这一点,也是网络蚂蚁和Fl ...

  9. springMVC获取request和response

    转载:http://blog.sina.com.cn/s/blog_7085382f0102v9jg.html 1.参数 例如: @RequestMapping("/test") ...

  10. JavaWeb项目开发案例精粹-第2章投票系统-005实体层

    1. package com.sanqing.bean; /** * * 投票选项类 * */ public class VoteOption { private int voteOptionID; ...