题意:给你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 (混合背包)的更多相关文章

  1. HDU 3535 AreYouBusy(混合背包)

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

  2. HDU 3535 分组混合背包

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

  3. hdu 3535 AreYouBusy 分组背包

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

  4. hdu 3535 AreYouBusy

    // 混合背包// xiaoA想尽量多花时间做ACM,但老板要求他在T时间内做完n堆工作,每个工作耗时ac[i][j],// 幸福感ag[i][j],每堆工作有m[i]个工作,每堆工作都有一个性质,/ ...

  5. HDU3535 AreYouBusy 混合背包

    题目大意 给出几组物品的体积和价值,每组分为三种:0.组内物品至少选一个:1.组内物品最多选一个:2.组内物品任意选.给出背包容量,求所能得到的最大价值. 注意 仔细审题,把样例好好看完了再答题,否则 ...

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

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

  7. HDU 3535 AreYouBusy 经典混合背包

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

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

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

  9. UESTC 424 AreYouBusy --混合背包

    混合三种背包问题. 定义:dp[i][k]表示体积为k的时候,在前i堆里拿到的最大价值. 第一类,至少选一项,dp初值全赋为负无穷,这样才能保证不会出现都不选的情况.dp[i][k] = max(dp ...

随机推荐

  1. HDU1020字符串操作

    #include <stdio.h> #include <string.h> int N; int size; void main() { scanf("%d&quo ...

  2. manacher算法专题

    一.模板 算法解析:http://www.felix021.com/blog/read.php?2040 *主要用来解决一个字符串中最长回文串的长度,在O(n)时间内,线性复杂度下,求出以每个字符串为 ...

  3. Json在PHP与JS之间传输

    1. JS-->PHP a). JS create Json <script> $(document).ready(function(){ /*--JS create Json--* ...

  4. Sublime Text 3 安装Package Control

    原来Subl3安装Package Control很麻烦,现在简单的方法来了 一.简单的安装方法 使用Ctrl+`快捷键或者通过View->Show Console菜单打开命令行,粘贴如下代码: ...

  5. EBS中利用Socket与外系统通信

    某银行要求做一个签到签退功能,日终EBS系统发送报文与核心系统对帐,规定利用Socket来做传送,记录下步骤: 1.编辑: $INST_TOP/ora/10.1.3/j2ee/oacore/appli ...

  6. 分布式的Id生成器

    项目中需要一个分布式的Id生成器,twitter的Snowflake中这个既简单又高效,网上找的Java版本 package com.cqfc.id; import org.slf4j.Logger; ...

  7. 玩QQ游戏,见到好几个图像是美女的QQ,就不始玩

    玩QQ游戏,见到好几个图像是美女的QQ,光占坑就是不开始玩 加了一个,发现是传播不良网站的QQ 聊天还是自动的 估计是利用webqq写的程序,也就那几句话来回重复,让你去注册网站什么 可以加这个Q去体 ...

  8. soft-margin SVM

    1. soft-margin SVM的形式 其中ξn表示每个点允许的犯错程度(偏离margin有多远),但是犯错是有代价的,也就是目标函数里面要最小化的.c控制对犯错的容忍程度. 2. 推导soft ...

  9. linux Mint18 backspace怎么不能连续删除

    打开菜单--->首选项--->键盘,如下图所示: 打开启用重复按键即可,就可以随心所欲的连续删除,连续移动光标了

  10. 【EasyUI】 日期格式化

    本文经过了测试,解决getFullyear() is not a function等问题 效果如下: 首先: Oracle中字段设置为DATE,MySQL中设置为DATETIME,MyBatis中会自 ...