题源:https://codeforces.com/gym/101635/attachments

题意: n行,每行给定字符串s1,s2,s3代表一些菜谱名。s2和s3是煮成是的必要条件,然后给出c和v,分别代表s1的消耗和收获;

   (注意:这个消耗并不可能是s1的真正消耗和收获,s1的最后消耗和收获是得加上s2和s3的)

   然后问在不用超过C消耗的情况下最大收获是多少?

分析:这里我们可以想象到,一道有条件的菜要做成是要若干个“前提”菜做成的,这个过程就是拓扑排序!我们对于每个s1,s2,s3编号后就是拓扑排序了,s2,s3,就是相当于给予s1一个入度;

   所有每次拓扑我们就枚举已经做成的s2和s3给最优的c和v给s1,然后最后对所有的菜进行01背包找出答案

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
const int inf=0x3f3f3f3f;
const ll INF=1e18;
const int N=1e6+;
const int M=1e5+;
struct node{
int u,id;
};
vector<node>g[N];
ll dp[M],cc[M],vv[M],ind[M],book[N];
ll c[N],v[N];
int ID,cnt;
char s1[],s2[],s3[];
map<int,int>mp;
map<string ,int>sign;
queue<int>que;
int getid(string x){
if(sign[x]==){
sign[x]=++ID;
}
return sign[x];
}
int main(){
int C,n;
scanf("%d%d",&C,&n);
for(int i=;i<=n;i++){
scanf("%s%s%s%lld%lld",s1,s2,s3,&c[i],&v[i]);
int z=getid(s1);
int x=getid(s2);
int y=getid(s3);
ind[z]++;
cc[z]=inf;
mp[i]=z;
g[x].pb({y,i});
g[y].pb({x,i});
}
for(int i=;i<=ID;i++){
if(ind[i]==)
que.push(i);
}
while(!que.empty()){
int x=que.front();
que.pop();
for(int i=;i<g[x].size();i++){
node nowv=g[x][i];
int y=nowv.u,id=nowv.id,z=mp[id];
if(!book[id]&&ind[y]==){
book[id]=;
ll cost=cc[x]+cc[y]+c[id];
ll val=vv[x]+vv[y]+v[id];
if(cc[z]>cost||(cc[z]==cost&&vv[z]<val)){
cc[z]=cost;
vv[z]=val;
}
if(--ind[z]==)
que.push(z);
} }
} dp[]=;
for(int i=;i<=ID;i++){
for(int j=C;j>=;j--)
if(j-cc[i]>=)
dp[j]=max(dp[j],dp[j-cc[i]]+vv[i]);
}
ll maxx=;
ll lasc=;
for(int i=;i<=C;i++){
if(dp[i]>maxx){
maxx=dp[i];
lasc=i;
}
}
printf("%lld\n%lld\n",maxx,lasc);
return ; }

E - Ingredients 拓扑排序+01背包的更多相关文章

  1. Crazy Shopping(拓扑排序+完全背包)

    Crazy Shopping(拓扑排序+完全背包) Because of the 90th anniversary of the Coherent & Cute Patchouli (C.C. ...

  2. hdu 3466 排序01背包

    也是好题,带限制的01背包,先排序,再背包 这题因为涉及到q,所以不能直接就01背包了.因为如果一个物品是5 9,一个物品是5 6,对第一个进行背包的时候只有dp[9],dp[10],…,dp[m], ...

  3. zoj 3524(拓扑排序+多重背包)(好题)

    http://blog.csdn.net/woshi250hua/article/details/7824773 题目大意:从前有n座山,山里都有一座庙,庙里都有一个老和尚,老和尚专送纪念品,每个纪念 ...

  4. 【Luogu】P1417烹调方案(排序01背包)

    题目链接 对食材进行排序,重载运算符代码如下: struct food{ long long a,b,c; bool operator <(const food &a)const{ re ...

  5. ZOJ-3524 拓扑排序+完全背包(好题)

    题意:在一个DAG上,主角初始有W钱起点在s点,每个点有一个代价wi和价值vi,主角从起点走到某一点不能回头走,一路上可以买东西(一个点的东西可以买无限次),且体力消耗为身上负重*路径长度.主角可以在 ...

  6. DP专题·三(01背包+完全背包)

    1.hdu 2126 Buy the souvenirs 题意:给出若干个纪念品的价格,求在能购买的纪念品的数目最大的情况下的购买方案. 思路:01背包+记录方案. #include<iostr ...

  7. hdu 3466 Proud Merchants(有排序的01背包)

    Proud Merchants Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...

  8. 2019.01.20 bzoj5158 Alice&Bob(拓扑排序+贪心)

    传送门 短代码简单题. 题意简述:对于一个序列XXX,定义其两个伴随序列a,ba,ba,b,aia_iai​表示以第iii个数结尾的最长上升子序列长度,bib_ibi​表示以第iii个数开头的最长下降 ...

  9. Proud Merchants HDU - 3466 (思路题--有排序的01背包)

    Recently, iSea went to an ancient country. For such a long time, it was the most wealthy and powerfu ...

随机推荐

  1. tableau-参数

    tableau参数可用在计算字段.筛选器和参考线中替换常量值得动态值. 三种方式:1.在计算字段中使用筛选器 案例动态替换计算字段中设定的目标值. 创建参数 以参数值创建计算字段 2.筛选器中使用参数 ...

  2. 微信小程序手绘地图实现之《Canvas》

    环境:微信SDK2.9+   + uniapp (可切换直接使用.map.js不限制环境) 正题: 先创建一个地图组件 <template> <view class="cu ...

  3. bzoj 4318OSU!

    和tyvj的Easy一样吧(然而还是不会2333) 期望是不能直接平方的(涨姿势),所以,,呵呵 #include<bits/stdc++.h> #define inf 0x7ffffff ...

  4. 【每日Scrum】第十天冲刺

    一.计划会议内容 尝试整合代码 二.任务看板 任务看板 已完成:登录与个人界面布局实现,UI设计美化,地图主界面 进行中:功能整合, 待进行:连接数据库 三.scrum讨论照片 四.产品的状态 无 五 ...

  5. SQL的查询结果复制到Excel 带标题Head 有换行符导致换行错乱 的解决方案

    将SQL查询到的结果保存为excel有很多方法,其中最简单的就是直接复制粘贴了 1.带Head的复制粘贴 1)先左击红色区域实现选择所有数据 2)随后右击选择Copy with Headers  再粘 ...

  6. spring boot 接口返回值封装

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  7. CTF - bugku-分析

    1.flag被盗 下载链接是.pcang文件 用wireshark打开 像这种流量分析题目,就要用Wireshark自带的搜索功能找尝试查找一些关键词(比如key.flag.shell.pass等) ...

  8. hook键盘钩子_非dll

    unit Unit1; // download by http://www.codefans.net interface uses Windows, Messages, SysUtils, Class ...

  9. python之路(dingo 框架)

    Python之路  转载自QIMI老师  Python之路 第一篇:Python基础 PyCharm使用秘籍免费视频教程v3 ... 迭代器生成器 模块和常用内置模块 面向对象 面向对象进阶 网络编程 ...

  10. Java多人聊天室第一版

    package cn.zhang.chat; import java.io.BufferedReader; import java.io.PrintWriter; /** * 所有用户均有的信息,单独 ...