HDU 3535 AreYouBusy (混合背包)
题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型:
0:此组中最少选择一个
1:此组中最多选择一个
2:此组随便选
每种物品有两个值:是需要价值ci,可获得乐趣gi
问在满足条件的情况下,可以得到的最大的乐趣是多少,如果不能满足条件就输出-1
题解:二维01背包
dp[i][j]:前i组物品我们拥有j的价值时最大可获得的乐趣
0:我们需要先把dp[i]所有赋值为负无穷,这样就只能最少选一个才能改变负无穷
1:我们不需要:dp[i][j-ci]+gi(在此组中再选一个),这样就一定最多选一个
其他的就是标准二维01背包
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define eps 1E-8
/*注意可能会有输出-0.000*/
#define Sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
#define Cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
#define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
#define mul(a,b) (a<<b)
#define dir(a,b) (a>>b)
typedef long long ll;
typedef unsigned long long ull;
const int Inf=<<;
const ll INF=1ll<<;
const double Pi=acos(-1.0);
const int Mod=1e9+;
const int Max=;
int dp[Max][Max];
struct node
{
int typ,len;
int cos[Max],val[Max];
} num[Max];
int Pack(int n,int m)
{
for(int i=; i<=m; ++i) //不一定填满
dp[][i]=;
for(int i=; i<=n; ++i) //分组的混合背包
{
if(!num[i].typ)//最少选一个
{
for(int j=; j<=m; ++j)
dp[i][j]=-Inf;//注意是负无穷,这样就最少选择一个
for(int j=; j<num[i].len; ++j)
{
for(int k=m; k>=num[i].cos[j]; --k) //01背包
{
dp[i][k]=max(dp[i][k],max(dp[i-][k-num[i].cos[j]]+num[i].val[j],dp[i][k-num[i].cos[j]]+num[i].val[j]));
}
}
}
else if(num[i].typ==)//最多选一个
{
for(int j=; j<=m; ++j)//注意二维背包
dp[i][j]=dp[i-][j];
for(int k=; k<num[i].len; ++k)
{
for(int j=m; j>=num[i].cos[k]; --j) //01背包
{
dp[i][j]=max(dp[i][j],dp[i-][j-num[i].cos[k]]+num[i].val[k]);//只需要判断每个j的上一次选择就最多选一次
}
}
}
else//随便选
{
for(int j=; j<=m; ++j)//注意二维背包
dp[i][j]=dp[i-][j];
for(int k=; k<num[i].len; ++k)
{
for(int j=m; j>=num[i].cos[k]; --j) //01背包
{
dp[i][j]=max(dp[i][j],max(dp[i-][j-num[i].cos[k]]+num[i].val[k],dp[i][j-num[i].cos[k]]+num[i].val[k]));
}
}
}
}
return max(dp[n][m],-);
}
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
for(int i=; i<=n; ++i)
{
scanf("%d %d",&num[i].len,&num[i].typ);
for(int j=; j<num[i].len; ++j)
{
scanf("%d %d",&num[i].cos[j],&num[i].val[j]);
}
}
printf("%d\n",Pack(n,m));
}
return ;
}
HDU 3535 AreYouBusy (混合背包)的更多相关文章
- HDU 3535 AreYouBusy(混合背包)
HDU3535 AreYouBusy(混合背包) http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意: 给你n个工作集合,给你T的时间去做它们.给你m和 ...
- HDU 3535 分组混合背包
http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n组工作,T时间,每个工作组中有m个工作,改组分类是s,s是0是组内至少要做一件,是1时最多做一件 ...
- hdu 3535 AreYouBusy 分组背包
AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- hdu 3535 AreYouBusy
// 混合背包// xiaoA想尽量多花时间做ACM,但老板要求他在T时间内做完n堆工作,每个工作耗时ac[i][j],// 幸福感ag[i][j],每堆工作有m[i]个工作,每堆工作都有一个性质,/ ...
- HDU3535 AreYouBusy 混合背包
题目大意 给出几组物品的体积和价值,每组分为三种:0.组内物品至少选一个:1.组内物品最多选一个:2.组内物品任意选.给出背包容量,求所能得到的最大价值. 注意 仔细审题,把样例好好看完了再答题,否则 ...
- [HDU 3535] AreYouBusy (动态规划 混合背包 值得做很多遍)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n个任务集合,需要在T个时间单位内完成.每个任务集合有属性,属性为0的代表至少要完成1个 ...
- HDU 3535 AreYouBusy 经典混合背包
AreYouBusy Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Su ...
- HDU 3535 AreYouBusy (混合背包之分组背包)
题目链接 Problem Description Happy New Term! As having become a junior, xiaoA recognizes that there is n ...
- UESTC 424 AreYouBusy --混合背包
混合三种背包问题. 定义:dp[i][k]表示体积为k的时候,在前i堆里拿到的最大价值. 第一类,至少选一项,dp初值全赋为负无穷,这样才能保证不会出现都不选的情况.dp[i][k] = max(dp ...
随机推荐
- 总结:JSP几种提交表单方法
问题描述: 最近进了一家“老公司”工作,说他老不是说他成立的早,是因为他的编程框架太l.......low了.EJB的规范模式,使用是IBM经过Eclipse二次开发出来的RAD(Rational A ...
- NFS
测试版本:CentOS 6.4 64b NFS监听2049(TCP/UDP)端口,但由于文件系统非常复杂,不同的功能都会使用不同的程序来启动,因此额外端口就会不固定(随机1024以下的),这就需要向远 ...
- 1.1、MyEclipse自定义注释
一.修改进入路径: Window->Preference->Java->Code Style->Code Template->Comments 二:编辑自定义注释 文件 ...
- sql注入时易被忽略的语法技巧以及二次注入
那些容易被忽略.容易被弄错的地方 sql注入时的技巧 ========================================================================= ...
- 记一次Suse下的Django环境配置——第一弹
一.安装Python 由于原有Suse自带的Python版本只有2.4,因此首先需要安装Python的高版本,在这里我选择使用Python2.7.9.PS:之前选择使用2.7.11版本,由于没有zli ...
- web 安全杂谈
以前写过一篇关于session.cookie的博文,都是简单的介绍.不过session和cookie和网络安全可有着密切的关系. 今天主要从这几个方面总结下最近学到的东西: 1. session 两种 ...
- BZOJ3522——[Poi2014]Hotel
1.题意:http://www.lydsy.com/JudgeOnline/problem.php?id=3522 2.分析:这道题有两种情况,第一个是三个点在同一个链上,这显然不可能了,因为树上的路 ...
- android onCreate中获取view宽高为0的解决方法
view.post(runnable) 通过post可以将一个runnable投递到消息队列的尾部,然后等待UI线程Looper调用此runnable的时候,view也已经初始化好了. view.po ...
- WPF相关开源项目
MahApps 排名第一的是MahApps框架. 该框架不错.详细信息请去官网. cefsharp 能让你在应用中嵌入谷歌浏览器页
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...