题意:给你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. leetcode--Majority Element

    题目链接:https://leetcode.com/problems/majority-element/ 算法类型:分治法 题目分析:获取长度为n的数组中的众数(出现次数大于等于⌊ n/2 ⌋) 代码 ...

  2. ASP.NET vNext on CentOS 7

    第一步是在Linux上安装.Net的运行时Mono VNext要求Mono最小版本3.4.1,可怜的centos连低版本的mono都不含.我们只能通过编译来安装.目前最新的版本为3.12 源码下载:h ...

  3. Live YUV420 和 OpenCV Mat 的互相转换

    1. YUV420 -> Mat 可用于转换接受到的YUV视频源到OpenCV可以识别的数据 Mat myuv( Frame_Height + Frame_Height / 2, Frame_W ...

  4. java从基础知识(十)java多线程(上)

    线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点 ...

  5. JS数组求最大值和最小值

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. day8

    作业要求:     1.用socket写一个 ftp服务端与客户端     2.支持get put命令 作业下载地址:ftp://www.wudonghang.com/oldboy/day8.zip ...

  7. CocoaPods报错:The dependency `AFNetworking ` is not used in any concrete target 解决办法

    产生这个问题的原因是最新版本的CocoaPods把Podfile文件的书写格式改变了,官网推荐用如下格式书写: platform :ios, '8.0' use_frameworks! target ...

  8. CPrimerPlus第11章第10题

    题目: 编写一个程序,读取输入,直到读入了10个字符串或遇到EOF,由二者中最先被满足的那个终止读取过程.这个程序可以为用户提供一个有5个选项的菜单:输出初始字符串列表.按ASCII顺序输出字符串.按 ...

  9. mui学习记录

    1.页面间传值 2.mui如何增加自定义icon图标 http://ask.dcloud.net.cn/article/128 3.设计基于HTML5的APP登录功能及安全调用接口的方式(原理篇) h ...

  10. 如何封装JS ----》JS设计模式《------ 封装与信息隐藏

    1. 封装与 信息隐藏之间的关系 实质是同一个概念的两种表达,信息隐藏式目的,二封装是借以达到目的的技术方法.封装是对象内部的数据表现形式和实现细节,要想访问封装过额对象中的数据,只有使用自己定义的操 ...