ssl2295-暗黑破坏神【dp练习】
题目:
无聊中的小x玩起了Diablo I...
游戏的主人公有n个魔法
每个魔法分为若干个等级,第i个魔法有p[i]个等级(不包括0)
每个魔法的每个等级都有一个效果值,一个j级的i种魔法的效果值为w[i][j]
魔法升一级需要一本相应的魔法书
购买魔法书需要金币,第i个魔法的魔法书价格为c[i]
而小x只有m个金币(好孩子不用修改器)
你的任务就是帮助小x决定如何购买魔法书才能使所有魔法的效果值之和最大
开始时所有魔法为0级 效果值为0。
Input
第一行 用空格隔开的两个整数n(0
以下n行 描述n个魔法
第i+1行描述 第i个魔法 格式如下(0
c[i] p[i] w[i][1] w[i][2] ... w[i][p[i]]
Output
第一行输出一个整数,即最大效果
Sample Input
3 10
1 3 1 2 2
2 3 2 4 6
3 3 2 1 10
Sample Output
11
1
0
3
解题思路
这道题刚开始想了忒久,然后终于做错了。后来经dalao一指点终于开窍,原来那么简单。第一行可以用正常的分组背包,接着后面的用一个数组记录,
如:b[选到的组数][所用的价格]=选的等级。
然后递归返回就ok了╮(╯﹏╰)╭是的吧。
然后一切尽在die代码中
代码(这次就不用代码片了):
#include<cstdio>
#include<iostream>
using namespace std;
int b[101][501],c[101],a[101][51],f[101][501],p[101],m,n,ss[501],x,y;
bool flag;
void print(int x,int y)//返回
{
if (x==0) return;//到第1个后返回
print(x-1,y-b[x][y]*c[x]);//递归回去
printf("%d\n",b[x][y]);//输出
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
scanf("%d%d",&c[i],&p[i]);
for (int j=1;j<=p[i];j++)
{
scanf("%d",&a[i][j]);
}
}
//以上输入依旧不解释
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
f[i][j]=f[i-1][j];//继承上一个
for (int k=0;k<=p[i];k++)
{
if (c[i]*k>j) break;//如果当前的价值大于j了则可以退出了
if (f[i][j]<f[i-1][j-c[i]*k]+a[i][k])//如果找到更大的
{
f[i][j]=f[i-1][j-c[i]*k]+a[i][k];//替换
b[i][j]=k;//记录
}
}
}
}
printf("%d\n",f[n][m]);//输出最大值
for (int j=m;j>=1;j--)
for (int i=n;i>=1;i--)//注意递归顺序(⊙v⊙)
if (f[i][j]>=f[x][y])//注意是>=不是>
{
x=i;
y=j;
}//寻找最大值,让递归次数少些。
print(x,y);//看上面↑
for (int i=x+1;i<=n;i++) printf("0\n");//输出后面少的那些0
}
ssl2295-暗黑破坏神【dp练习】相关推荐
- dp,sp,px相互转化
方法一: public int sp2px(float sp) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, ...
- [JS][dp]题解 | #打家劫舍(一)#
题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...
- HDU 2084 数塔(DP)(JAVA版)
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- dp cf 20190615
A. Timofey and a tree 这个不算是dp,就是一个思维题,好难想的思维题,看了题解才写出来的, 把点和边分开,如果一条边的两个点颜色不同就是特殊边,特殊边两边连的点就叫特殊点, 如果 ...
- BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)
Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MB Submit ...
- [NOI2005]聪聪与可可(期望dp)
题意:给一张无向图,有一只猫和一只老鼠,猫每秒会向老鼠的方向移动两个单位,若它们的距离为一,那么只会移动一个单位,老鼠会等概率向周围移动一步或不动,求猫抓到老鼠的期望时间. Solution luog ...
- Codeforces 903F Clear The Matrix(状态压缩DP)
题目链接 Clear The Matrix 题意 给定一个$4 * n$的矩形,里面的元素为$'.'$或$'*'$.现在有$4$种正方形可以覆盖掉$'*'$,正方形的边长分别为$1,2,3,4$. 求 ...
- 喵哈哈村的魔法考试 Round #1 (Div.2) 题解源码(A.水+暴力,B.dp+栈)
A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05 最后更新: 2017年2月21日 20:06 时间限制: 1000ms 内存限制: 128M 描述 传说喵哈哈村有三种神 ...
- 尼克的任务 dp 洛谷1280
蒟蒻表示老久没看过dp题目了,,挺水的一道dp题目都没想出来,,, 首先设dp[i]表示从开始到i时间的最大空闲时间,用vector to[x] 表示从x点开始的任务结束时间,cnt[x]表示从x开始 ...
- BNUOJ 52305 Around the World 树形dp
题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...
最新文章
- 春愁(shunshu)—Mrs. Green Apple (歌词、汉译、罗马音)
- 哈啰顺风车成立5亿元“顺风绿色出行基金”
- 数据中心基础设施:建设与设计
- 【NOI2013】向量内积
- mysql 同步更新_MySQL slave 不能同步更新
- [转]MacBook Pro上装三系统 OS X、Ubuntu、Win 7
- 牛客多校10 - Decrement on the Tree(边权转点权+思维)
- jstl 处理Date 时间
- 2019长安大学ACM校赛网络同步赛 L XOR
- Java常用的几个Json库
- 【Java】 IDEA使用教程
- 酷柚易汛进销存开发进度一览表以及各版本之间区别!
- windows7下安装sharex视频截图报错,需要下载ffmpeg——Unknown input or output format: gdigrab
- Ubuntu:安装rust
- Spring Cloud Gateway 3.1.3最新版中文手册官网2022
- ffmpeg用drawtext filter 给视频加字幕,代码实现
- Unity3D优化技巧系列七
- oracle exp导出工具,Oracle EXP/IMP 导出导入工具的使用
- 你对java工程师的理解_JAVA工程师常见面试题(一):谈谈对死锁的看法?
- FFmpeg下载和编译
热门文章
- java dos编译命令是什么_在DOS命令行状态下,如果源程序HelloWorld.java在当前目录下,那么编译该程序的命令是()...
- 数字图像处理王伟强_深度学习主导下,还有必要学数字图像处理?
- 数据结构——图-迪杰斯特拉算法
- ciclop读音,购机必备,15种 3D扫描 设备 优缺点汇总
- [JavaWeb-MySQL]多表关系介绍
- 莫比乌斯反演/容斥 +2020ICPC 江西省大学生程序设计竞赛 	A Simple Math Problem
- Oulipo HDU - 1686(哈希或KMP)匹配字符串
- 数据结构与算法--解决问题的方法- 二叉树的的镜像
- Hystrix在网关Zuul使用中遇到问题
- python窗口显示表格_pyqt 调用tablewidget窗口时无法显示窗口内容