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 ...
随机推荐
- javascript 日期操作
1.获取指定年月有多少周 /** * 获得一个月的周数 * @param {} y {xxxx}4位数 * @param {} m {0-11} * @return {} */ function ge ...
- bootstrap中popover.js(弹出框)使用总结+案例
bootstrap中popover.js(弹出框)使用总结+案例 *转载请注明出处: 作者:willingtolove: http://www.cnblogs.com/willingtolove/p/ ...
- Genymotion安装及遇到的问题
https://www.genymotion.com/ 首先注册,不注册看不到下载按钮. 注册登陆后下载安装包(一定要记住用户名和密码,因为安装后登陆要用) 一路下一步. 选择虚拟设备 genymot ...
- Nginx设置线程数为整机内核数的俩倍!
Nginx设置线程数为整机内核数的俩倍!
- 如何配置IIS处理多并发请求及存在的问题
很多时候多线程能快速高效独立的计算数据,应用比较多. 但今天遇到的多进程下的问题更是让人觉得复杂 多进程下static变量都要失效,就目前的平台和产品static使用是很多的,各种session.ca ...
- 等价类划分方法的应用(jsp)
[问题描述] 在三个文本框中输入字符串,要求均为1到6个英文字符或数字,按submit提交. [划分等价类] 条件1: 字符合法; 条件2: 输入1长度合法; 条件3: 输入2长度合法: 条件4: 输 ...
- Mac Pro 编译安装 Redis 的 PHP 客户端 phpredis
1.去官网下载 redis 扩展源码包 https://github.com/phpredis/phpredis 2.安装 redis 扩展 /usr/local/src/mac-sdk/source ...
- android 弹出AlertDialog的学习案例
我在编写的时候,测试的关键代码: AlertDialog.Builder builder=new AlertDialog.Builder(MainPointListActivity.this); bu ...
- MVC-命名空间“System.Web.Mvc”中不存在类型或命名空间名称“Html”(是否缺少程序集引用?)
如上截图,明明引用了“System.web.mvc”,可是还出这样的错误. 解决方法: 1.右键引用的“System.Web.Mvc” 2.<复制本地>一样选择<True> 3 ...
- virtualBox上虚拟机和主机互联{}
VirtualBox实现内外网络互访问的配置 环境: 宿主机操作系统 Windows XP sp3 虚拟机软件 VirtualBo ...