洛谷P1860 新魔法药水
动态规划:
这个题目调了我好久。。。。结果循环变量写错了。。。
而且题目有个坑!!!只能用开始给你的$v$元买入东西
回归正题:
我们定义状态$ans[i][j]$表示第$i$个物品用了至多$j$次魔法的最小花费,但是我们发现这样子的话不好与合成关系联系在一起,那么我们再定义一个数组$f[i][j]$表示某一个合成关系中,前$i$个物品中用至多$j$次魔法合成的最小花费
那么最后就普通$dp$就行了
#include<iostream>
#include<cstdio>
#include<cstring>
#define inf 0x7f7f7f7f
#define M 300
#define K 31
using namespace std;
struct Magic
{
int to,num,thing[M];
}magic[M];
int n,m,v,k;
int pay[M],get[M],f[M][M],ans[M][M],dp[M][1007];
int main()
{
scanf("%d%d%d%d",&n,&m,&v,&k);
for(int i=1;i<=n;++i)
scanf("%d%d",&pay[i],&get[i]);
for(int i=1;i<=m;++i)
{
scanf("%d%d",&magic[i].to,&magic[i].num);
for(int j=1;j<=magic[i].num;++j)
scanf("%d",&magic[i].thing[j]);
}
for(int i=1;i<=n;++i)
for(int j=0;j<=k;++j)
ans[i][j]=pay[i];
for(int l=1;l<=k;++l)
{
for(int i=1;i<=m;++i)
{
for(int j=1;j<=magic[i].num;++j)
for(int o=0;o<l;++o)
{
f[j][o]=inf;
for(int oo=0;oo<=o;++oo)
f[j][o]=min(f[j][o],f[j-1][o-oo]+ans[magic[i].thing[j]][oo]);
}
ans[magic[i].to][l]=min(ans[magic[i].to][l],f[magic[i].num][l-1]);
}
}
// for(int i=1;i<=n;++i)
// {
// for(int j=1;j<=m;++j)
// printf("%d ",ans[i][j]);
// printf("\n");
// }
for(int i=1;i<=n;++i)
for(int j=0;j<=k;++j)
for(int o=0;o<=k-j;++o)
for(int l=ans[i][j];l<=v;++l)
dp[j+o][l]=max(dp[j+o][l],dp[o][l-ans[i][j]]+get[i]-ans[i][j]);
printf("%d",dp[k][v]);
return 0;
}
洛谷P1860 新魔法药水的更多相关文章
- 洛谷P1860——新魔法药水
传送门:QAQQAQ 题意:商店里有N种药水,每种药水都有一个售价和回收价.小S攒了V元钱,还会M种魔法,可以把一些药水合成另一种药水.他一天可以使用K次魔法,问他一天最多赚多少钱? N<=60 ...
- 洛谷P1242 新汉诺塔(dfs,模拟退火)
洛谷P1242 新汉诺塔 最开始的思路是贪心地将盘子从大到小依次从初始位置移动到目标位置. 方法和基本的汉诺塔问题的方法一样,对于盘子 \(i\) ,将盘子 \(1\to i-1\) 放置到中间柱子上 ...
- 洛谷 P1305 新二叉树
P1305 新二叉树 题目描述 输入一串完全二叉树,用遍历前序打出. 输入输出格式 输入格式: 第一行为二叉树的节点数n. 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输 ...
- Luogu P1860 新魔法药水
题目大意 具体题面及输入格式戳我! 商店里有\(N\)种药水,每种药水都有一个售价和回收价. 小\(S\) 攒了\(V\)元钱,还会\(M\)种魔法,可以把一些药水合成另一种药水. 他在第一天可以购买 ...
- 洛谷 P1305 新二叉树 Label:字符串的输出总是有惊喜
题目描述 输入一串完全二叉树,用遍历前序打出. 输入输出格式 输入格式: 第一行为二叉树的节点数n. 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输出格式: 前序排列的完 ...
- 洛谷P1242 新汉诺塔
传送门啦 首先要将第n个盘子从x到y,那么就要把比n小的盘子全部移到6-x-y,然后将n移到y 仔细想想:6代表的是3根初始柱,3根目标柱. 6-(x+y) 便是我们的中转柱了,因为到这个位置是最优的 ...
- 洛谷P1242 新汉诺塔 【神奇的递归】
题目描述 设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号.将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A.B.C,这个状态称为初始状态. 现在要求找到一种步数最少的移动方案,使得从初 ...
- [P1860]新魔法药水
题目描述 商店里有N种药水,每种药水都有一个售价和回收价.小S攒了V元钱,还会M种魔法,可以把一些药水合成另一种药水.他一天可以使用K次魔法,问他一天最多赚多少钱? 输入输出格式 输入格式: 第一行四 ...
- 洛谷 [P4301] 新Nim游戏
线性基 +博弈论 先手必胜当且仅当先手取完之后留下的序列无论如何组合,异或和都不为 0 也就是剩下的整数线性无关,所以我们对所有整数排序,由高往低的贪心的插入线性基, 无法插入的就有先手取出,容易发现 ...
随机推荐
- docker相关--dockerd日志设置
背景 线上容器dockerd的后台程序打印了超过几十G的日志 Docker daemon日志的位置: Docker daemon日志的位置,根据系统不同各不相同. Ubuntu - /var/log/ ...
- QMetaMethod 获取成员函数的元信息
在上一篇中,我们将的是QMetaEnum类,它可以获得一个类中由Q_ENUM宏或Q_FLAG宏声明的枚举类型的元信息.同样,QMetaMethod类是用来获取成员方法的元信息的一个类.通过该类,我们可 ...
- BZOJ3879 SvT(后缀树+虚树)
对反串建SAM得到后缀树,两后缀的lcp就是其在后缀树上lca的len值,于是每次询问对后缀树建出虚树并统计答案即可. #include<iostream> #include<cst ...
- eclipse设置各种编码
https://blog.csdn.net/qq_32786873/article/details/81910022
- Django2.0 开始一个项目
python项目运行环境: 安装虚拟环境工具 pip install virtualenv 使用虚拟环境: 创建虚拟环境: virtualenv <虚拟环境名称> 进去虚拟环境: S ...
- .Net IOC 框架
CastleWindsor 参见:CastleWindsor | .Net IOC 框架 AutoFace 参见:AutoFace | .Net IOC 框架 Unity 参见:Unity | .Ne ...
- 《浏览器工作原理与实践》 <12>栈空间和堆空间:数据是如何存储的?
对于前端开发者来说,JavaScript 的内存机制是一个不被经常提及的概念 ,因此很容易被忽视.特别是一些非计算机专业的同学,对内存机制可能没有非常清晰的认识,甚至有些同学根本就不知道 JavaSc ...
- python-----多进程笔记
多进程笔记: 在Python中多进程的创建方式对比: 1.在Python中,可以通过os.fork()创建子进程,但是这种方式智能在'linux'和'unix'以及'mac'下面使用,不能跨平台,所以 ...
- idou老师带你认识Istio13:Istio实现基础认证策略
前言 微服务架构提供了更好的灵活性.可伸缩性以及服务复用的能力,但,微服务也有特殊的安全需求,Istio Security尝试提供全面的安全解决方案.为了提供灵活的服务访问控制,需要双向 TLS 和细 ...
- PAT Advanced 1140 Look-and-say Sequence (20 分)
Look-and-say sequence is a sequence of integers as the following: D, D1, D111, D113, D11231, D112213 ...