题目链接

Problem Description

Happy New Term!

As having become a junior, xiaoA recognizes that there is not much time for her to AC problems, because there are some other things for her to do, which makes her nearly mad.

What's more, her boss tells her that for some sets of duties, she must choose at least one job to do, but for some sets of things, she can only choose at most one to do, which is meaningless to the boss. And for others, she can do of her will. We just define the things that she can choose as "jobs". A job takes time , and gives xiaoA some points of happiness (which means that she is always willing to do the jobs).So can you choose the best sets of them to give her the maximum points of happiness and also to be a good junior(which means that she should follow the boss's advice)?

Input

There are several test cases, each test case begins with two integers n and T (0<=n,T<=100) , n sets of jobs for you to choose and T minutes for her to do them. Follows are n sets of description, each of which starts with two integers m and s (0<m<=100), there are m jobs in this set , and the set type is s, (0 stands for the sets that should choose at least 1 job to do, 1 for the sets that should choose at most 1 , and 2 for the one you can choose freely).then m pairs of integers ci,gi follows (0<=ci,gi<=100), means the ith job cost ci minutes to finish and gi points of happiness can be gained by finishing it. One job can be done only once.

Output

One line for each test case contains the maximum points of happiness we can choose from all jobs .if she can’t finish what her boss want, just output -1 .

Sample Input

3 3

2 1

2 5

3 8

2 0

1 0

2 1

3 2

4 3

2 1

1 1

3 4

2 1

2 5

3 8

2 0

1 1

2 8

3 2

4 4

2 1

1 1

1 1

1 0

2 1

5 3

2 0

1 0

2 1

2 0

2 2

1 1

2 0

3 2

2 1

2 1

1 5

2 8

3 2

3 8

4 9

5 10

Sample Output

5

13

-1

-1

分析:

题目大意:有 n 组任务,T 个体力,每组任务有 m 个,分类为 type,每个任务花费 cose[] 体力,得到 value[] 的开心值,求最大开心值,若不能完成输出-1

     分类为 0:这一组中的 m 个任务至少选择一个。

     分类为 1:这一组中的 m 个任务最多选择一个。

     分类为 2:这一组中的 m 个任务随便选择。

定义:dp[i][k]:完成第 i 组任务时,体力为 k 时获得的开心值。

1.对于分类 0,若当前判断到一个任务 case,则有两种情况:

(1)它是该组第一个被选择的任务,则它更新的状态只能是将上一层的状态转移更新到当前位置。

dp[i][k]=max(dp[i][k],dp[i-1][k-cost[j]]+value[j]);

(2)它不是第一个被选择的任务,则它可以由当前组的状态转移更新到当前位置。

dp[i][k]=max(dp[i][k],dp[i][k-cost[j]]+value[j]);

为了方便判断处理第一个任务,初始化当前层为 -inf

2.对于分类 1,因为只能选一个或者不选,则它只能由上一层状态转移更新。

dp[i][k]=max(dp[i][k],dp[i-1][k-cost[j]]+value[j]);

3.对于分类 2,就是普通的 01背包问题

肯定是要从上层的转移过来:dp[i][k]=max(dp[i][k],dp[i-1][k-cost[j]]+value[j]);

但是还需要考虑到一点就是说,这个组里面的任务可以选取任意多的个数:

dp[i][k]=max(dp[i][k],dp[i][k-cost[j]]+value[j]);

代码:

#include<stdio.h>
#include<iostream>
#include<string.h>
const long long N=200;
using namespace std;
const int inf=0x3f3f3f3f;
int dp[N][N];
int n,T;
int cost[N],value[N];
int main()
{
while(~scanf("%d%d",&n,&T))
{
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++)
{
int m,type;
scanf("%d%d",&m,&type);
for(int j=1; j<=m; j++)
scanf("%d%d",&cost[j],&value[j]);
if(type==0)//最少选择一个工作
{
for(int j=0; j<=T; j++)
dp[i][j]=-inf;//方便处理第一个任务,初始化为-inf
for(int j=1; j<=m; j++)
for(int k=T; k>=cost[j]; k--)
{
dp[i][k]=max(dp[i][k],dp[i][k-cost[j]]+value[j]);//不是改组中第一个任务,从改组中的其他任务更新来
dp[i][k]=max(dp[i][k],dp[i-1][k-cost[j]]+value[j]);//如果是改组中第一个被选择的任务,在从上一组更新来
}
}
else if(type==1)//选择一个或不选
{
for(int j=0; j<=T; j++)
dp[i][j]=dp[i-1][j];//只能由上一层的状态转移来
for(int j=1; j<=m; j++)
for(int k=T; k>=cost[j]; k--)
{
dp[i][k]=max(dp[i][k],dp[i-1][k-cost[j]]+value[j]);
}
}
else//可以任意的选择
{
for(int j=0; j<=T; j++)
dp[i][j]=dp[i-1][j];//从上一层转移过来
for(int j=1; j<=m; j++)
for(int k=T; k>=cost[j]; k--)
{
dp[i][k]=max(dp[i][k],dp[i][k-cost[j]]+value[j]);//由因为每组内的任务可以多选
dp[i][k]=max(dp[i][k],dp[i-1][k-cost[j]]+value[j]);//直接转移上一层的
}
}
}
dp[n][T]=max(dp[n][T],-1);
printf("%d\n",dp[n][T]);
}
return 0;
}

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 1712 ACboy needs your help (分组背包模版题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712 有n门课,和m天时间.每门课上不同的天数有不同的价值,但是上过这门课后不能再上了,求m天里的最大 ...

  5. 【HDU】I love sneakers!(分组背包)

    看了许多的题解,都有题目翻译,很不错,以后我也这样写.直接翻译样例: /*鞋子的数量N[1, 100]; 拥有的金钱M[1, 1w]; 品牌数目[1, 10]*/ /*以下四行是对于每双鞋的描述*/ ...

  6. 【HDU - 4341】Gold miner(分组背包)

    BUPT2017 wintertraining(15) #8B 题意 给出每个黄金的坐标.价值及耗时,同一方向的黄金只能依次取,求T时间内收获的最大值. 题解 同一方向,物品前缀和构成的组合,相当于是 ...

  7. 洛谷 P1757 通天之分组背包 【分组背包】

    题目链接:https://www.luogu.org/problemnew/show/P1757#sub 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包 ...

  8. HDU 3535 AreYouBusy (混合背包)

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

  9. HDU 3535 AreYouBusy 经典混合背包

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

随机推荐

  1. [百度贴吧]10GB 通信线缆

    现在,即使光纤通信能够带来最低延迟的优势,但是许多IT部门依然在10G以太网(10G bE)中使用铜缆布线,来实现交换机和交换机或者和服务器之间的连接.目前主要有两种主要的铜缆布线技术应用在10 Gb ...

  2. [转贴]systemd 编写服务管理脚本

    [转贴]sparkdev大神的博客, 关于 systemd的配置文件的 介绍, 自己之前二进制安装 k8s 时 超过一个 service文件 但是当时不明不白的. 现在再学习一下大神的文章 的确牛B ...

  3. .net对Redis集群的调用(FrameWork版本4.0)

    使用 StackExchange.Redis 实现.net对Redis集群的调用,方法如下: 1.打开 项目-管理NuGet程序包 2.在打开界面搜索StackExchange.Redis,找到Sta ...

  4. 【HDU4336】Card Collector(Min-Max容斥)

    [HDU4336]Card Collector(Min-Max容斥) 题面 Vjudge 题解 原来似乎写过一种状压的做法,然后空间复杂度很不优秀. 今天来补一种神奇的方法. 给定集合\(S\),设\ ...

  5. 51nod 1785 数据流中的算法 | STL的应用

    51nod 1785 数据流中的算法 题面 动态求平均数.方差.中位数. 题解 这道题的坑: 平均数在答案中是向下取整输出并在后面添加".00" 方差:平方的平均数减去平均数的平方 ...

  6. 如何在低速率网络中测试 Web 应用

    大家看到标题后的第一个问题可能是:“我们需要这样做吗?” 如果我们开发的是局域网 Web 应用的话,可能没有必要这样做.但如果我们的 Web 应用面向的是互联网上的成千上万的用户,这样做就很必要了.因 ...

  7. CSS3 grayscale滤镜+SVG使图片变黑白实例页面

    CSS代码: .gray { -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale( ...

  8. python调用powershell、远程执行bat

    python调用本地powershell方法 1.现在准备一个简陋的powershell脚本,功能是测试一个IP列表哪些可以ping通: function test_ping($iplist) { f ...

  9. E - Down or Right Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)

    http://codeforces.com/contest/1023/problem/E 交互题 #include <cstdio> #include <cstdlib> #i ...

  10. 布隆过滤器 Bloom Filter

    使用普通集合来判断一个元素是否已存在于集合中,需要占用比较大的空间.而使用Bloom Filter 可有效节省空间. Bloom Filter 以较少的内存占用及较小的误判率达到判断元素是否存已经加入 ...