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 ...
随机推荐
- ubuntu mysql使用
用navicat远程连不上mysql,提示10061错误解决办法: 修改/etc/mysql/my.cnf文件,找到127.0.0.1行,注释该行 命令:vi my.cnf 按i键进入编辑模式 编辑完 ...
- Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同?
看知乎:https://www.zhihu.com/question/20400700 了解的越多,就会发现,越多不了解.
- GetWord 3.3 屏幕取词
1. 缘起 要搞一个作弊软件,需要把屏幕上的试题取下来. 据说针对IE的取词很难,所以也就打消了自己开发的念头,找一找好用的控件. 发现了两个可以用的,一个是金山词霸的XdictGrb.dll文件,一 ...
- C和指针 第十五章 错误报告perror和exit
15.1 错误报告 perror 任何一种程序都存在出错的可能,包括系统的函数库,当出现错误时,系统提示发生错误,标准库函数在一个外部整型变量中保存错误代码,然后把错误代码传给用户程序,提示错误原因. ...
- 项目vue2.0仿外卖APP(六)
goods 商品列表页开发 布局编写 除了商品之外还有购物车,还有个详情页,挺复杂的. 两栏布局:左侧固定宽度,右侧自适应,还是用flex. 因为内容可能会超过手机高度,超过就隐藏.左右两侧的内容是可 ...
- 使用angular.bootstrap() 完成模块的手动加载
之前我们看到使用ng-app指令,可以实现模块的自动加载.现在我们看下,angular中如何手动加载模块.需要使用到angular.bootstrap这个函数. <html> <he ...
- AM335x kernel 4.4.12 i2c eeprom AT24c02驱动移植
kernel 4.4.12 i2c eeprom AT24c02驱动移植 在kernel make menuconfig ARCH=ARM 中打开: Device Drivers ---> Mi ...
- 【转】Linux下Fork与Exec使用
Linux下Fork与Exec使用 转自 Linux下Fork与Exec使用 一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.for ...
- Java_太阳系_行星模型_小游戏练习_详细注释
//实现MyFrame--实现绘制窗口,和实现重写 重画窗口线程类 package cn.xiaocangtian.Test; import java.awt.Frame; import java.a ...
- iOS之小门道道
1.代理方法不执行 很多时候在你代理方法不执行时,小样,你看看你设置代理了吗?