DP

首先考虑如何将答案DP转移出来

记$dp[i][j]$表示使用了$i$次魔法,用了$j$个金币时的最大获利

因为可以将几个药水合成一个药水

那么在转移时会发现还需要处理出用了第$i$种药水由$j$次魔法合成的最小成本,记此为$tc[i][j]$

那么转移方程就是$dp[i][j]=min(dp[i-q][j-tc[p][q]]+w[p]-tc[p][q])$

$w$表示这个药水的售价

那么现在就要处理出$tc$数组

对于$tc[i][j]$,因为当前合成i需要一次操作,那么分配给其原料的合成次数为$j-1$

$tc[i][j]=max(\sum_{k=1}^{Number}tc[a[k]][t[k]])$

且$\sum_{k}^{Number}t[k]=j-1$

$a$数组表示这个合成这个药水的原料,$t$为给这个原料分配合成的次数,$Number$为原料总数

那么这个表达式也是可以DP转移的

记$tmp[i][j]$表示前$i$个原料,用了$j$次魔法的最小成本

填表转移即可

注意此处合成同一个药水的配方可能有多个

那么在这多个配方中$tc$选取最佳的即可

#include <bits/stdc++.h>
#define inf (int)1e9
using namespace std;
int n,m,v,k,tmp[100][100],tc[100][100];
int dp[45][1100];
struct node
{int v,w;
}sh[100];
struct magic
{int p,h;vector <int> a;
}d[300];
int main()
{scanf("%d%d%d%d",&n,&m,&v,&k);for (int i=1;i<=n;i++)scanf("%d%d",&sh[i].v,&sh[i].w);for (int i=1;i<=m;i++){scanf("%d%d",&d[i].p,&d[i].h);for (int j=1;j<=d[i].h;j++){int num;scanf("%d",&num);d[i].a.push_back(num);}}for (int i=1;i<=n;i++){for (int j=1;j<=k;j++)tc[i][j]=inf;tc[i][0]=sh[i].v;}for (int j=1;j<=k;j++){for (int i=1;i<=m;i++){for (int p=0;p<j;p++)tmp[0][p]=tc[d[i].a[0]][p];//初始值for (int p=1;p<(int)d[i].a.size();p++){for (int q=0;q<j;q++){tmp[p][q]=inf;for (int r=0;r<=q;r++)tmp[p][q]=min(tmp[p][q],tmp[p-1][r]+tc[d[i].a[p]][q-r]);//tmp的DP转移}}tc[d[i].p][j]=min(tc[d[i].p][j],tmp[(int)d[i].a.size()-1][j-1]);//在多个方案中取最优}}for (int i=0;i<=k;i++){for (int j=0;j<=v;j++)dp[i][j]=-inf;}dp[0][0]=0;for (int i=0;i<=k;i++){for (int j=0;j<=v;j++){for (int p=1;p<=n;p++){for (int q=0;q<=i;q++){if (tc[p][q]==inf)continue;if (j>=tc[p][q])//注意边界条件dp[i][j]=max(dp[i][j],dp[i-q][j-tc[p][q]]+sh[p].w-tc[p][q]);  //转移}}}}int ans=0;for (int i=0;i<=k;i++){for (int j=0;j<=v;j++)ans=max(ans,dp[i][j]);//统计答案}printf("%d\n",ans);
}

转载于:https://www.cnblogs.com/huangchenyan/p/11305070.html

Luogu P1860 新魔法药水相关推荐

  1. 洛谷P1860——新魔法药水

    传送门:QAQQAQ 题意:商店里有N种药水,每种药水都有一个售价和回收价.小S攒了V元钱,还会M种魔法,可以把一些药水合成另一种药水.他一天可以使用K次魔法,问他一天最多赚多少钱? N<=60 ...

  2. [P1860]新魔法药水

    题目描述 商店里有N种药水,每种药水都有一个售价和回收价.小S攒了V元钱,还会M种魔法,可以把一些药水合成另一种药水.他一天可以使用K次魔法,问他一天最多赚多少钱? 输入输出格式 输入格式: 第一行四 ...

  3. 解题报告:luogu P1688 新单词接龙问题【trie树、dfs、DP递推】

    单词的变化有三种:1删掉一个字母,2:插入一个字符,3:将一个字符变成另外一个字符 dig→fig→fin→fine→winedig→fig→fin→fine→winedig→fig→fin→fine ...

  4. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  5. NOIP前的刷题记录

    因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数   组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ...

  6. 平静的纪中生活(2021.7.12~7.22)

    平静的目录 Day 0 凌晨(不要问为什么有这个) 早上 下午 晚上 Day 1 早上 中午 下午 晚上 今天的博客 Day 2 早上 中午 下午 晚上 今天的博客 Day 3 早上 中午 下午 晚上 ...

  7. C++学习笔记(第一、二阶段汇总)

    文章目录 cmake 命名空间 匿名命名空间 C与C++混合编程 引用 共用体 inline内联函数 关于多次定义 class类初步了解 inline函数在c++中唯一一个多出来的特性 这个特性的目的 ...

  8. [Luogu 3258] JLOI2014 松鼠的新家

    [Luogu 3258] JLOI2014 松鼠的新家 LCA + 树上差分. 我呢,因为是树剖求的 LCA,预处理了 DFN(DFS 序),于是简化成了序列差分. qwq不讲了不讲了,贴代码. #i ...

  9. 洛谷P1875 佳佳的魔法药水

    P1875 佳佳的魔法药水 链接:https://www.luogu.org/problemnew/show/P1875 题目背景 发完了 k 张照片,佳佳却得到了一个坏消息:他的 MM 得病了!佳佳 ...

最新文章

  1. WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8
  2. 微软模拟飞行2020服务器多少内存,《微软模拟飞行2020》配置公开,想玩爽还需玩家加大投入...
  3. Statement与PreparedStatement区别
  4. 计算机网络现在成功,百收计算机网络努力的人是怎么成功的
  5. mac python3.8上怎么安装pygame 第三方库_Python3.8安装Pygame Python3.8安装Pygame教程步骤详解...
  6. Markdown中希腊字母与代码对应表
  7. chromium关闭更新_Win10今年最重磅更新!Win10 2004正式版详尽体验
  8. boost_1.47在VS2010下的安装
  9. 桔子浏览器电脑版收藏夹位置在哪里 收藏夹位置路径
  10. 10-1 channel
  11. 轴承公差以及常见的轴孔公差配合
  12. 2020年产品经理面试题
  13. 基本粒子结构以及宇宙现象的徦说
  14. 西门子标准报文1常用_深入学习PROFIdrive驱动控制协议(1)
  15. 【Math】证明随机分布X1, X2, ..., Xn独立同分布的最大概率问题
  16. mysql jail_2.1.5 jail在生产环境下的注意事项
  17. 智能优化算法之蚁群算法(ACO)
  18. 香港科技大学计算机专业博士申请,协助申请研究生MSc博士PhD,香港高校【计算机2021提前批】已经开放,含【港府奖学金】...
  19. Merkle Tree算法详解
  20. 2021.3.12日报:修复miniblink vip版本的性能问题

热门文章

  1. 云服务器有什么优势和特点?
  2. php多次请求只执行最后一次,取消重复请求,只让最后一次请求通过
  3. xampp control-panel深深的坑
  4. 知识图谱赵军学习笔记(十)--知识问答与对话
  5. 如何用大数据软件确定 数码电子店铺选址
  6. UltraEdit15.10的注册码
  7. Documentum 6.7 DFC client not connecting
  8. javascript实现鼠标移动两个小人的动画效果
  9. NDK学习笔记<六> 反编译现成的项目,调用该项目的so文件
  10. 认生、内敛不等同于孤独症[图]