O - 酱神寻宝

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

酱神来到了一座小岛,岛上有n个箱子。

一共有3中不同的钥匙,金钥匙、银钥匙和万能钥匙。酱神一开始有a把金钥匙、b把银钥匙和c把万能钥匙。

第i个箱子上有xi把金锁,yi把银锁。金钥匙只能打开金锁,银钥匙只能打开银锁,万能钥匙两种锁都能打开。用于打开锁的钥匙会立刻损坏,酱神会丢掉损坏的钥匙。箱子里有ai把金钥匙、bi把银钥匙和ci把万能钥匙,想要取出箱内的钥匙必须要打开这xi+yi把锁。

酱神的目的是使他拥有的钥匙总数最多。一旦酱神认为自己已经拥有了最多的钥匙,他就不会去开剩下的箱子了。

Input

第一行一个数n。

接下来有n行。每行5个数,xi,yi,ai,bi,ci。

最后一行3个数a,b,c。

1=<n<=15

0=<xi,yi,ai,bi,ci,a,b,c<=10

Output

输出一个数酱神的最多钥匙数。

Sample input and output

Sample Input Sample Output
3
1 0 0 0 1
2 4 0 8 0
3 9 10 9 8
3 1 2
8
1
0 0 1 2 3
0 0 0
6

Hint

第一个样例中酱神会打开第一个和第二个箱子。

解题思路:

首先贪心,能用金 / 银就不用万能钥匙.

我们不妨令 f ( i , j ) -> 开启箱子的状态为 i , 金钥匙为 j 把时能获得最多的万能钥匙.

之后我们考虑更新,设 0 为没开启过, 1 为开启过.

每次更新都是由 x 个 0 的状态更新到 x+1 个 0 的状态.

我们采用bfs维护这种顺序即可

不过由于本题数据很水,各位可以尝试各种花式方法水过去!!

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
/*
f( i , j ) - > 当前开的箱子的集合为 i , 金钥匙的数目是 j 时可以获得的最多万能钥匙数目.
*/ using namespace std;
const int maxn = ;
int n,sta,stb,stc,f[ << ][ maxn* ],ans = ;
typedef struct Item
{
int needA,needB,getA,getB,getC;
}; typedef struct updatastatus
{
int st,number;
updatastatus(const int &st,const int &number)
{
this->st = st , this->number = number;
}
}; bool arrived[ << ][maxn * ];
queue<updatastatus>q;
Item A[maxn+]; inline void updata(int i,int j,int newans)
{
f[i][j] = max(f[i][j],newans);
} //可以开启为 0 , 不能开启为 1; int main(int argc,char *argv[])
{
scanf("%d",&n);
for(int i = ; i < n ; ++ i) scanf("%d%d%d%d%d",&A[i].needA,&A[i].needB,&A[i].getA,&A[i].getB,&A[i].getC);
scanf("%d%d%d",&sta,&stb,&stc);
f[][sta] = stc; // Init;
memset(arrived,false,sizeof(arrived));
q.push(updatastatus(,sta));
while(!q.empty())
{
updatastatus ns = q.front();q.pop();
int ra = ns.number, rb, rc = f[ns.st][ns.number] , all = sta + stb + stc , st = ns.st;
for(int i = ; i < n ; ++ i)
if (ns.st >> i & )
all += A[i].getA + A[i].getB + A[i].getC - A[i].needA - A[i].needB;
ans = max(ans,all);
rb = all - ra - rc;
for(int i = ; i < n ; ++ i)
{
if (!(st >> i & ))
{
int needA = A[i].needA;
int needB = A[i].needB;
int getA = A[i].getA;
int getB = A[i].getB;
int getC = A[i].getC;
if (ra >= needA) //金够
{
if (rb >= needB) //金银都够
{
updata(st | ( << i) , ra - needA + getA, rc + getC);
if (!arrived[st | ( << i)][ra - needA + getA])
{
q.push(updatastatus(st | ( << i),ra - needA + getA));
arrived[st | ( << i)][ra - needA + getA] = true;
}
}
else //金够银不够
{
if (needB- rb <= rc)
{
updata(st | ( << i) , ra - needA + getA, rc - needB + rb + getC);
if (!arrived[st | ( << i)][ra - needA + getA])
{
q.push(updatastatus(st | ( << i),ra - needA + getA));
arrived[st | ( << i)][ra - needA + getA] = true;
}
}
}
}
else
{
if (rb >= needB) //金不够银够
{
if (needA - ra <= rc)
{
updata(st | ( << i) , getA, rc - needA + ra + getC);
if (!arrived[st | ( << i)][getA])
{
q.push(updatastatus(st | ( << i),getA));
arrived[st | ( << i)][getA] = true;
}
}
}
else //金不够银不够
{
if (needA - ra + needB - rb <= rc)
{
updata(st | ( << i) , getA, rc - needA + ra - needB + rb + getC);
if (!arrived[st | ( << i)][getA])
{
q.push(updatastatus(st | ( << i),getA));
arrived[st | ( << i)][getA] = true;
}
}
}
}
}
}
}
printf("%d\n",ans);
return ;
}

UESTC_酱神寻宝 2015 UESTC Training for Dynamic Programming<Problem O>的更多相关文章

  1. UESTC_酱神的旅行 2015 UESTC Training for Dynamic Programming<Problem M>

    M - 酱神的旅行 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  2. UESTC_酱神赏花 2015 UESTC Training for Dynamic Programming<Problem C>

    C - 酱神赏花 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Submi ...

  3. UESTC_邱老师选妹子(二) 2015 UESTC Training for Dynamic Programming<Problem I>

    I - 邱老师选妹子(二) Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Su ...

  4. UESTC_邱老师选妹子 2015 UESTC Training for Dynamic Programming<Problem H>

    H - 邱老师选妹子 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  5. UESTC_邱老师看电影 2015 UESTC Training for Dynamic Programming<Problem F>

    F - 邱老师看电影 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  6. UESTC_男神的约会 2015 UESTC Training for Dynamic Programming<Problem J>

    J - 男神的约会 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  7. UESTC_男神的礼物 2015 UESTC Training for Dynamic Programming<Problem A>

    A - 男神的礼物 Time Limit: 3000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  8. UESTC_导弹拦截 2015 UESTC Training for Dynamic Programming<Problem N>

    N - 导弹拦截 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  9. UESTC_菲波拉契数制升级版 2015 UESTC Training for Dynamic Programming<Problem L>

    L - 菲波拉契数制升级版 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Su ...

随机推荐

  1. Ubuntu 16.04 LTS 正式发布:系统将持续更新5年

    Canonical 刚刚正式发布了Ubuntu 16.04 LTS (Xenial Xerus),这是一个长期支持版本,官方会提供长达5年的技术支持(包括常规更新/Bug修复/安全升级),一直到202 ...

  2. ios相册

    1, 系统图片剪裁的问题 http://www.cnblogs.com/liulunet/archive/2013/01/19/2866399.html

  3. oracle 12g sqlplus安装

    一.下载oracle 12g sqlplus软件 linux 64位操作系统,oracle安装包地址 http://www.oracle.com/technetwork/topics/linuxx86 ...

  4. 【转】invokeRequired属性和 invoke()方法

    C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它. 此时它将会在内部调用n ...

  5. 数据分析系统DIY3/3:本地64位WIN7+matlab 2012b訪问VMware CentOS7+MariaDB

    数据分析系统DIY中要完毕的三个任务. 一.用VMware装64位CentOS.数据库服务端用CentOS自带的就好. 二.数据採集与预处理用Dev-C++编程解决. 三.用本地Win7 64上的MA ...

  6. Linux :: vi E212: Can't open file for writing

    Linux :: vi E212: Can't open file for writing sysct1.conf 可能无写权限!查看方法:ls -lh /etc/sysct1.conf如果没有,则c ...

  7. maven报错cannot change version of project facet

    用Eclipse创建Maven结构的web项目的时候选择了默认的catalog,由于这个catalog比较老,用的servlet还是2.3,而现在最少也是2.5,所以经常会出现问题,在Projecdt ...

  8. 前端--关于CSS

    CSS全名层叠样式表,层叠的含义有三个:1.按照特殊性的高低,特殊性高的覆盖特殊性低的样式声明:2.不同属性的样式声明要合并:3.后出现的相同的样式声明覆盖先出现的.所以要改变样式的优先级也有三种方法 ...

  9. jquery插件datepicker

    jQuery UI很强大,其中的日期选择插件Datepicker是一个配置灵活的插件,我们可以自定义其展示方式,包括日期格式.语言.限制选择日期范围.添加相关按钮以及其它导航等. <script ...

  10. CSS - 关于li中图文混排不能垂直居中的问题

    图片和文字一起放在li标签下不能同时垂直居中   解决办法: 1.设置图片的position:absolute; 2.把文字加上span标签: span{ height:30px;line-heigh ...