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 描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下, ...
随机推荐
- Hexo博客插入图片的方法
Hexo博客插入图片的方法 hexo图片blog hexo blog 插入图片的方法总结 hexo 的blog 内容是根据 markdown 文件的内容生成的html文件, 生成的文件全部在 /pub ...
- web 之 session
Session? 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务器程序可以 ...
- Linux系统介绍与环境搭建准备
1 什么是操作系统? 操作系统,Operating System,简称OS,是计算机系统中必不可少的基础软件,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统的核心. 操作系统的作用是 ...
- Intellij-IDEA-maven+springMVC+mybatis整合
2019独角兽企业重金招聘Python工程师标准>>> GitHub地址 https://github.com/Ethel731/WebProjectDemo 前言 之前都是在已经建 ...
- AngularJS学习1-基础知识
Angular并不是适合任何应用的开发,Angular考虑的是构建CRUD应用 但是目前好像也只是用到了angular的一些指令,数据绑定,mvc,http服务而已..... 以前传统的做法就是,通过 ...
- 自定义Bootstrap样式弹出框
最近做的一些功能需要用到Bootstrap,然而原来的系统并没有引入Bootstrap,为了新写的控件能够应用于老的页面,又不需要在老的页面上引入全套的Bootstrap文件决定写一个模仿Bootst ...
- Egg Dropping Puzzle
The Two Egg Problem 曾经是Google的一道经典题. 题意:有一个百层高楼,鸡蛋在\(L\)层及以下扔都不碎,在\(L\)层以上都会碎.现在某人有\(k\)个鸡蛋,问在最坏情况下, ...
- Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();
一.先从size 和capacity 说起 resize(),设置大小(size); reserve(),设置容量(capacity); size()是分配容器的内存大小,而capacity()只是设 ...
- 数学--数论--HDU 12151七夕节 Plus (因子和线性筛)
Problem Description 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!" ...
- 疯子的算法总结14--ST算法(区间最值)
借助倍增和动态规划可以实现O(1)的时间复杂度的查询 预处理: ①区间DP 转移方程 f[i][j] = min(MAX同理)(f[i][j - 1],f[i + ][j - 1]) f[i] ...