hdu6007 spfa+完全背包
题意:给你M,N,K,代表你有M点法力值,N个物品,K个制造方式
接下来N行,如果以1开头则代表既能卖又能合成,0代表只能卖。
然后K行,每行第一个数是要合成的东西,第二个数代表有几对,每对第一个数是那种物品,第二个是需要几个。
注意不能直接合成的可以通过制造方式来合成。然后问你花费完所有的法力制造的东西,能获得最大的金钱是多少
题解:首先处理出来对于所有物品所需要消耗的最小法力值,然后就是做一下完全背包就可以了。
消耗最小法力值可以通过spfa获得,一个技巧就是对于同属一个目标产物的原材料,可以用一个fa[]数组来指向目标产物的vector的数组下标.目标产物有两个vector,其中一个代表了是哪几种原材料,然后另一个对应的是这几种原材料的个数。
然后再利用head[]数组,得知一个目标产物的原材料的边的编号tot一定是连续的,那么就把这连续一段的边的编号指为当前目标产物的两个vector的数组下标就可以了。
具体详见代码。---强迫症是从0开始计的,所以说建边的时候要减一
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int INF=0x3f3f3f3f;
int dp[],sell[],pct[],head[];
bool vis[];
int M,N,K,op,n,T,tas=,tot;
struct node
{
int v,next;
} e[];
void add(int u,int v)
{
e[tot].v=v;
e[tot].next=head[u];
head[u]=tot++;
}
vector<int>U[];
vector<int>num[];
int fa[];
void spfa()
{
queue<int>Q;
for(int i=; i<N; ++i) if(pct[i]!=INF)
{
Q.push(i),vis[i]=;
}
while(!Q.empty())
{
int u=Q.front();
Q.pop();
vis[u]=;
for(int i=head[u]; ~i; i=e[i].next)
{
bool ok=;
int ans=;
for(int j=; j<(int)U[fa[i]].size(); ++j)
{
if(pct[U[fa[i]][j]]==INF)
{
ok=;
break;
}
ans+=pct[U[fa[i]][j]]*num[fa[i]][j];
}
if(!ok) continue;
if(ans<pct[e[i].v])
{
pct[e[i].v]=ans;
if(!vis[e[i].v]) Q.push(e[i].v),vis[e[i].v]=;
}
}
}
}
int main()
{
for(scanf("%d",&T); T--;)
{
memset(head,-,sizeof(head));
memset(pct,INF,sizeof(pct));
tot=;
scanf("%d%d%d",&M,&N,&K);
for(int i=; i<N; ++i)
{
scanf("%d",&op);
if(op==) scanf("%d",&sell[i]);
else scanf("%d%d",&pct[i],&sell[i]);
}
int now=;
for(int i=; i<K; ++i)
{
int tar,par,ne,nn;
scanf("%d%d",&tar,&par);
if(!par) continue;
U[now].clear();
num[now].clear();
int last=tot;
--tar;
for(int j=; j<par; ++j)
{
scanf("%d%d",&ne,&nn);
--ne;
add(ne,tar);
U[now].push_back(ne);
num[now].push_back(nn);
}
for(int j=last; j<tot; ++j) fa[j]=now;
++now;
}
spfa();
memset(dp,,sizeof(dp));
for(int i=; i<N; ++i) for(int j=pct[i]; j<=M; ++j) dp[j]=max(dp[j],dp[j-pct[i]]+sell[i]);
printf("Case #%d: %d\n",tas++,dp[M]);
}
}
hdu6007 spfa+完全背包的更多相关文章
- In Action(SPFA+01背包)
In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU 3339 In Action【最短路+01背包模板/主要是建模看谁是容量、价值】
Since 1945, when the first nuclear bomb was exploded by the Manhattan Project team in the US, the n ...
- poj 1724ROADS(bfs和dfs做法)
/* dfs比较好想,就是测试数据的问题,导致在遍历边的时候要倒着遍历才过! */ #include<iostream> #include<cstdio> #include&l ...
- 【8.31校内测试】【找规律二分】【DP】【背包+spfa】
打表出奇迹!表打出来发现了神奇的规律: 1 1 2 2 3 4 4 4 5 6 6 7 8 8 8 8 9 10 10 11 12 12 12 13 14 14 15 16 16 16 16 16.. ...
- hdu6007 Mr. Panda and Crystal 最短路+完全背包
/** 题目:hdu6007 Mr. Panda and Crystal 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6007 题意:魔法师有m能量,有n ...
- SPOJ FISHER + FPOLICE SPFA+背包
当初第一次做的是FPLICE这个题,当时就觉得要用图论去搜索,但是当时陷入死思维就是 dp[][]两个维度都是点,这样就违背了题目的本意,题目给定了一个时间T,在不超过时间T的情况下求最小的消耗,这不 ...
- HDU 6007 Mr. Panda and Crystal (背包+spfa)
题意:你生活在一个魔法大陆上,你有n 魔力, 这个大陆上有m 种魔法水晶,还有n 种合成水晶的方式,每种水晶价格告诉你,并且告诉你哪些水晶你能直接造出来,哪些你必须合成才能造出来,问你n魔力最多能卖多 ...
- hdu3339 In Action(Dijkstra+01背包)
/* 题意:有 n 个站点(编号1...n),每一个站点都有一个能量值,为了不让这些能量值连接起来,要用 坦克占领这个站点!已知站点的 之间的距离,每个坦克从0点出发到某一个站点,1 unit dis ...
- nyoj 203 三国志(最短路加01背包)
三国志 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下, ...
随机推荐
- Ubuntu 之 win10更新ubuntu启动项消失
问题描述: 昨晚windows更新,今天启动的时候发现启动项没有了,直接进入windows. 解决方案一: 首先进入BIOS看一看是否开启启动项选择,然后再把安全模式(secure boot)关闭(重 ...
- 20060518: Alert!
Alert Received, Shrink My Blog! 转载于:https://www.cnblogs.com/yidinghe/archive/2006/05/18/403089.html
- php安装igbinary扩展(windows)
pecl.php.net 是php的扩展仓库,访问此网站后,搜索需要安装的扩展,截图如下: igbinary: http://pecl.php.net/package/redis github的网址: ...
- predixy源码学习
Predixy是一个代理,代理本质上就是用来转发请求的.其主要功能就是接收客户端的请求,然后把客户端请求转发给redis服务端,在redis服务端处理完消息请求后,接收它的响应,并把这个响应返回给客户 ...
- muduo网络库源码学习————原子性操作Atomic.h
原子性操作可以做到比互斥锁更小的开销,在多线程编程中原子性操作是非常有用的.Atomic.h文件位于muduo/base下,代码如下: // Use of this source code is go ...
- 跟哥一起学python(4)- 数据类型之Number
本节我们开始学习python的数据类型. 什么是数据类型呢?前面我们提过,所谓的编程,就是控制一系列的数据去完成我们预设的逻辑或者功能.所以,编程语言首先要定义一系列对“数据”的处理规则.这些处理规则 ...
- thinkphp5.x系列 RCE总结
Thinkphp MVC开发模式 执行流程: 首先发起请求->开始路由检测->获取pathinfo信息->路由匹配->开始路由解析->获得模块.控制器.操作方法调度信息 ...
- Taurus.MVC 2.3.2 :WebAPI 文档集成测试功能及附加<%# JS执行功能语法 %>
前言: 前些天有网友提到了那个界面丑陋的SwaggerUI,让我想起了多年前实现的WebAPI文档未完成的功能点,于是,动手了,便有了本文的内容. 开源地址:https://github.com/cy ...
- 第一个Vue-cli
第一步下载node.js https://nodejs.org/zh-cn/ 安装成功后 在cmd 输入 node -v 看看能不能打印出来 在cmd 输入 nmp-v 看看能不能打印出来 全局安装 ...
- JavaWebCase
目录 案例:用户登录 用户登录案例需求 分析 开发步骤 创建项目 创建数据库环境 创建包 com.my.domain,创建类User 创建包 com.my.dao,创建类UsesrDao,提供logi ...