Luogu P1860 新魔法药水
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 新魔法药水相关推荐
- 洛谷P1860——新魔法药水
传送门:QAQQAQ 题意:商店里有N种药水,每种药水都有一个售价和回收价.小S攒了V元钱,还会M种魔法,可以把一些药水合成另一种药水.他一天可以使用K次魔法,问他一天最多赚多少钱? N<=60 ...
- [P1860]新魔法药水
题目描述 商店里有N种药水,每种药水都有一个售价和回收价.小S攒了V元钱,还会M种魔法,可以把一些药水合成另一种药水.他一天可以使用K次魔法,问他一天最多赚多少钱? 输入输出格式 输入格式: 第一行四 ...
- 解题报告:luogu P1688 新单词接龙问题【trie树、dfs、DP递推】
单词的变化有三种:1删掉一个字母,2:插入一个字符,3:将一个字符变成另外一个字符 dig→fig→fin→fine→winedig→fig→fin→fine→winedig→fig→fin→fine ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- NOIP前的刷题记录
因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数 组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ...
- 平静的纪中生活(2021.7.12~7.22)
平静的目录 Day 0 凌晨(不要问为什么有这个) 早上 下午 晚上 Day 1 早上 中午 下午 晚上 今天的博客 Day 2 早上 中午 下午 晚上 今天的博客 Day 3 早上 中午 下午 晚上 ...
- C++学习笔记(第一、二阶段汇总)
文章目录 cmake 命名空间 匿名命名空间 C与C++混合编程 引用 共用体 inline内联函数 关于多次定义 class类初步了解 inline函数在c++中唯一一个多出来的特性 这个特性的目的 ...
- [Luogu 3258] JLOI2014 松鼠的新家
[Luogu 3258] JLOI2014 松鼠的新家 LCA + 树上差分. 我呢,因为是树剖求的 LCA,预处理了 DFN(DFS 序),于是简化成了序列差分. qwq不讲了不讲了,贴代码. #i ...
- 洛谷P1875 佳佳的魔法药水
P1875 佳佳的魔法药水 链接:https://www.luogu.org/problemnew/show/P1875 题目背景 发完了 k 张照片,佳佳却得到了一个坏消息:他的 MM 得病了!佳佳 ...
最新文章
- WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8
- 微软模拟飞行2020服务器多少内存,《微软模拟飞行2020》配置公开,想玩爽还需玩家加大投入...
- Statement与PreparedStatement区别
- 计算机网络现在成功,百收计算机网络努力的人是怎么成功的
- mac python3.8上怎么安装pygame 第三方库_Python3.8安装Pygame Python3.8安装Pygame教程步骤详解...
- Markdown中希腊字母与代码对应表
- chromium关闭更新_Win10今年最重磅更新!Win10 2004正式版详尽体验
- boost_1.47在VS2010下的安装
- 桔子浏览器电脑版收藏夹位置在哪里 收藏夹位置路径
- 10-1 channel
- 轴承公差以及常见的轴孔公差配合
- 2020年产品经理面试题
- 基本粒子结构以及宇宙现象的徦说
- 西门子标准报文1常用_深入学习PROFIdrive驱动控制协议(1)
- 【Math】证明随机分布X1, X2, ..., Xn独立同分布的最大概率问题
- mysql jail_2.1.5 jail在生产环境下的注意事项
- 智能优化算法之蚁群算法(ACO)
- 香港科技大学计算机专业博士申请,协助申请研究生MSc博士PhD,香港高校【计算机2021提前批】已经开放,含【港府奖学金】...
- Merkle Tree算法详解
- 2021.3.12日报:修复miniblink vip版本的性能问题