题目:

无聊中的小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练习】相关推荐

  1. dp,sp,px相互转化

    方法一: public int sp2px(float sp) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, ...

  2. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  3. HDU 2084 数塔(DP)(JAVA版)

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  4. dp cf 20190615

    A. Timofey and a tree 这个不算是dp,就是一个思维题,好难想的思维题,看了题解才写出来的, 把点和边分开,如果一条边的两个点颜色不同就是特殊边,特殊边两边连的点就叫特殊点, 如果 ...

  5. BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)

    Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MB Submit ...

  6. [NOI2005]聪聪与可可(期望dp)

    题意:给一张无向图,有一只猫和一只老鼠,猫每秒会向老鼠的方向移动两个单位,若它们的距离为一,那么只会移动一个单位,老鼠会等概率向周围移动一步或不动,求猫抓到老鼠的期望时间. Solution luog ...

  7. Codeforces 903F Clear The Matrix(状态压缩DP)

    题目链接 Clear The Matrix 题意 给定一个$4 * n$的矩形,里面的元素为$'.'$或$'*'$.现在有$4$种正方形可以覆盖掉$'*'$,正方形的边长分别为$1,2,3,4$. 求 ...

  8. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解源码(A.水+暴力,B.dp+栈)

    A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05   最后更新: 2017年2月21日 20:06   时间限制: 1000ms   内存限制: 128M 描述 传说喵哈哈村有三种神 ...

  9. 尼克的任务 dp 洛谷1280

    蒟蒻表示老久没看过dp题目了,,挺水的一道dp题目都没想出来,,, 首先设dp[i]表示从开始到i时间的最大空闲时间,用vector to[x] 表示从x点开始的任务结束时间,cnt[x]表示从x开始 ...

  10. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

最新文章

  1. 春愁(shunshu)—Mrs. Green Apple (歌词、汉译、罗马音)
  2. 哈啰顺风车成立5亿元“顺风绿色出行基金”
  3. 数据中心基础设施:建设与设计
  4. 【NOI2013】向量内积
  5. mysql 同步更新_MySQL slave 不能同步更新
  6. [转]MacBook Pro上装三系统 OS X、Ubuntu、Win 7
  7. 牛客多校10 - Decrement on the Tree(边权转点权+思维)
  8. jstl 处理Date 时间
  9. 2019长安大学ACM校赛网络同步赛 L XOR
  10. Java常用的几个Json库
  11. 【Java】 IDEA使用教程
  12. 酷柚易汛进销存开发进度一览表以及各版本之间区别!
  13. windows7下安装sharex视频截图报错,需要下载ffmpeg——Unknown input or output format: gdigrab
  14. Ubuntu:安装rust
  15. Spring Cloud Gateway 3.1.3最新版中文手册官网2022
  16. ffmpeg用drawtext filter 给视频加字幕,代码实现
  17. Unity3D优化技巧系列七
  18. oracle exp导出工具,Oracle EXP/IMP 导出导入工具的使用
  19. 你对java工程师的理解_JAVA工程师常见面试题(一):谈谈对死锁的看法?
  20. FFmpeg下载和编译

热门文章

  1. java dos编译命令是什么_在DOS命令行状态下,如果源程序HelloWorld.java在当前目录下,那么编译该程序的命令是()...
  2. 数字图像处理王伟强_深度学习主导下,还有必要学数字图像处理?
  3. 数据结构——图-迪杰斯特拉算法
  4. ciclop读音,购机必备,15种 3D扫描 设备 优缺点汇总
  5. [JavaWeb-MySQL]多表关系介绍
  6. 莫比乌斯反演/容斥 +2020ICPC 江西省大学生程序设计竞赛 A Simple Math Problem
  7. Oulipo HDU - 1686(哈希或KMP)匹配字符串
  8. 数据结构与算法--解决问题的方法- 二叉树的的镜像
  9. Hystrix在网关Zuul使用中遇到问题
  10. python窗口显示表格_pyqt 调用tablewidget窗口时无法显示窗口内容