cdoj 1141 酱神寻宝 状压dp
酱神寻宝
Time Limit: 20 Sec
Memory Limit: 256 MB
题目连接
http://acm.uestc.edu.cn/#/problem/show/1141
Description
酱神来到了一座小岛,岛上有n个箱子。
一共有3中不同的钥匙,金钥匙、银钥匙和万能钥匙。酱神一开始有a把金钥匙、b把银钥匙和c把万能钥匙。
第i个箱子上有xi把金锁,yi把银锁。金钥匙只能打开金锁,银钥匙只能打开银锁,万能钥匙两种锁都能打开。用于打开锁的钥匙会立刻损坏,酱神会丢掉损坏的钥匙。箱子里有ai把金钥匙、bi把银钥匙和ci把万能钥匙,想要取出箱内的钥匙必须要打开这xi+yi把锁。
酱神的目的是使他拥有的钥匙总数最多。一旦酱神认为自己已经拥有了最多的钥匙,他就不会去开剩下的箱子了。
Input
接下来有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
3
1 0 0 0 1
2 4 0 8 0
3 9 10 9 8
3 1 2
Sample Output
8
HINT
题意
题解:
状压dp,借用一个贪心的思想,每次能用A就用A,不能再用万能钥匙
啊,用的bfs实现的
代码:
//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define test freopen("test.txt","r",stdin)
#define maxn 2000001
#define mod 10007
#define eps 1e-9
int Num;
char CH[];
const int inf=0x3f3f3f3f;
const ll infll = 0x3f3f3f3f3f3f3f3fLL;
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline void P(int x)
{
Num=;if(!x){putchar('');puts("");return;}
while(x>)CH[++Num]=x%,x/=;
while(Num)putchar(CH[Num--]+);
puts("");
}
//**************************************************************************************
struct Box
{
int a,b,c,d,e;
}box[]; struct node
{
int a,b;
}; int dp[<<][];
int main()
{
//test;
int n=read();
for(int i=;i<n;i++)
box[i].a=read(),box[i].b=read(),box[i].c=read(),box[i].d=read(),box[i].e=read();
int aa=read(),bb=read(),cc=read();
memset(dp,-,sizeof(dp));
dp[][aa]=cc;
queue<node>q;
q.push((node){,aa});
int ans=;
while(!q.empty())
{
node now=q.front();
q.pop();
int all=aa+bb+cc;
for(int i=;i<n;i++)
{
if(now.a>>i&)
{
all+=box[i].c+box[i].d+box[i].e-box[i].a-box[i].b;
}
}
ans=max(ans,all);
int nowa=now.b,nowc=dp[now.a][now.b],nowb=all-nowa-nowc;
//cout<<all<<" "<<nowa<<" "<<nowb<<" "<<nowc<<endl;
for(int i=;i<n;i++)
{
if(!(now.a>>i&))
{
if(nowa>=box[i].a)
{
if(nowb>=box[i].b)
{
if(nowc+box[i].e>dp[now.a|(<<i)][nowa-box[i].a+box[i].c])
{
dp[now.a|(<<i)][nowa-box[i].a+box[i].c]=nowc+box[i].e;
q.push((node){now.a|(<<i),nowa-box[i].a+box[i].c});
}
}
else if(nowc+nowb>=box[i].b)
{
if(nowc+box[i].e-box[i].b+nowb>dp[now.a|(<<i)][nowa-box[i].a+box[i].c])
{
dp[now.a|(<<i)][nowa-box[i].a+box[i].c]=nowc+box[i].e-box[i].b+nowb;
q.push((node){now.a|(<<i),nowa-box[i].a+box[i].c});
}
}
}
else if(nowa+nowc>=box[i].a)
{
int sp=nowc-box[i].a+nowa;
if(nowb>=box[i].b)
{
if(nowc+box[i].e-box[i].a+nowa>dp[now.a|(<<i)][box[i].c])
{
dp[now.a|(<<i)][box[i].c]=nowc+box[i].e-box[i].a+nowa;
q.push((node){now.a|(<<i),box[i].c});
}
}
else if(sp+nowb>=box[i].b)
{
if(sp+box[i].e-box[i].b+nowb>dp[now.a|(<<i)][box[i].c])
{
dp[now.a|(<<i)][box[i].c]=sp+box[i].e-box[i].b+nowb;
q.push((node){now.a|(<<i),box[i].c});
}
}
}
}
}
}
cout<<ans<<endl;
}
cdoj 1141 酱神寻宝 状压dp的更多相关文章
- 【XSY2524】唯一神 状压DP 矩阵快速幂 FFT
题目大意 给你一个网格,每个格子有概率是\(1\)或是\(0\).告诉你每个点是\(0\)的概率,求\(1\)的连通块个数\(\bmod d=0\)的概率. 最开始所有格子的概率相等.有\(q\)次修 ...
- CDOJ 1402 三角形棋盘上的博弈游戏 状压DP
三角形棋盘上的博弈游戏 题目连接: http://mozhu.today/#/problem/show/1402 Description 柱爷有天上课无聊,于是和同桌卿学姐一起下一种奇特的棋: 棋盘如 ...
- HITOJ 2662 Pieces Assignment(状压DP)
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- hdu 4739 状压DP
这里有状态压缩DP的好博文 题目:题目比较神,自己看题目吧 分析: 大概有两种思路: 1.dfs,判断正方形的话可以通过枚举对角线,大概每次减少4个三角形,加上一些小剪枝的话可以过. 2.状压DP,先 ...
- hdu 3247 AC自动+状压dp+bfs处理
Resource Archiver Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Ot ...
- HDU 1074 Doing Homework【状压DP】
Doing Homework Problem Description Ignatius has just come back school from the 30th ACM/ICPC. Now he ...
- 【BZOJ3590】[Snoi2013]Quare 状压DP
这道题...神题. 首先看到数据范围,一眼状压 dp .然后? 没了. 理性分析,这里说断掉任意一条边图依然连通,即整个图构成一个边双(而不是点双). 之前用 fire (机房里的随机算法总称)之所以 ...
- 状压dp的另一种形式
做的那么多都是一些比较怎么说呢,都是在数网格一类的题目之中,这些题目有些有点固定的套路,而一些需要状态压缩的题目呢,则么是真正对状态转移的考验. 这道题呢,被彻底打脸了,以后一定要任性一点一道题做不出 ...
- Codeforces 429C Guess the Tree(状压DP+贪心)
吐槽:这道题真心坑...做了一整天,我太蒻了... 题意 构造一棵 $ n $ 个节点的树,要求满足以下条件: 每个非叶子节点至少包含2个儿子: 以节点 $ i $ 为根的子树中必须包含 $ c_i ...
随机推荐
- 网络加速手段之一,JS文件资源合并下载
有过ftp下载文件经验的人都有体验,单独下载一个100M的文件比分开下载100个1M的文件速度快很多,这是因为下载需要解析域名,建立连接等额外开销的时间,因此下载100个文件就要做100次这种额外的开 ...
- selenium python (三)鼠标事件
# -*- coding: utf-8 -*-#鼠标事件 #ActionChains类中包括: # context_click() 右击: ...
- jquery、js操作checkbox全选反选
全选反选checkbox在实际应用中比较常见,本文有个不错的示例,大家可以参考下 操作checkbox,全选反选//全选 function checkAll() { $('input[name=&qu ...
- pssh 不能执行指定用户命令
问题: 一个脚本a.sh(必须root用户执行),在本地可以运行,通过pssh -h ip_file "cd /home/byte/a.sh"不能执行. 原因: 分析应该是ssh ...
- javascript常用的小知识
1. oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键 <table border oncontextmenu ...
- 配置使VirtualBox下的linux可以宿主机互访并上网
1. 设置VirtualBox,选择桥接网卡 2. 配置linux的ifcfg-eth0 配置完成后,用service network restart重启网络. 3. 然后查后路由配置是否正确 如果没 ...
- Weibo Crawler in Action
1.要写一个微博爬虫,得分开几个模块来做: (1)模拟登录 (2)模拟浏览 (3)针对短时间内大量访问而引起怀疑的禁止登陆解决方案 (4)其他 (1)模拟登陆模块 前提:要模拟登录,得首先知道在登录微 ...
- Hadoop概念学习系列之hadoop生态系统闲谈(二十五)
分层次讲解 最底层平台 ------->hdfs yarn mapreduce spark 应用层-------->hbase hive pig sparkSQL nu ...
- enumerate
enumerate 函数用于遍历序列中的元素并分配一个序号(序号默认从零开始 可以制定任意值): >>> for i,j in enumerate(('a','b','c')): p ...
- oracle学习 七 拼接变量+日期函数(持续更)
select count(KEYCODE) from STHSGDOC.ZJSJJL where ysrq=to_date(to_char(sysdate,'yyyy')||'/1','yyyy/MM ...