题目链接

题目

题目描述

萌学姐在玩大型手游《futa go》,他现在准备进入作战环节,所以他准备安排自己的队伍。

队伍配置里,可供玩家选择的作战人物被称作“从者”,玩家可以对每个“从者”可以装备至多1件的“概念礼装”,玩家具有一个cost上限值。详细定义如下:

1、 每个从者和概念礼装都具有攻击值ATK。

2、 每个从者和概念礼装都会占据一定的cost值。

3、 每个从者和概念礼装只能上场一次,不能重复使用。

4、 概念礼装只能装备在从者上,不能单独存在。

5、 选择的从者和概念礼装的cost值之和不能超过玩家的cost上限值。

6、 最多可以选择5名从者(在cost值限制下)。

现在给出玩家仓库的每个从者和每件概念礼装的ATK值和cost值,问在满足定义的条件下,队伍可以凑出的最大ATK值

输入描述

第1行输入三个整数n,m,d,代表玩家仓库的从者数量、概念礼装数量和cost上限值。

第2-n+1行,每行输入两个整数a1,b1,表示第i个从者的ATK值和cost值。

第n+2-n+m+1行,每行输入两个整数a2,b2,表示第i个概念礼装的ATK值和cost值。

数据保证:0<n,m≤300,25≤d≤138,1000≤a1≤15488,500≤a2≤2500,3≤b1,b2≤12

输出描述

输出一行,一个整数,代表可以凑出的最大ATK值。

示例1

输入

4 2 25
2001 5
2002 5
2003 5
4010 10
2004 10
2005 10

输出

10016

说明

派上前4名从者,最大ATK值=2001+2002+2003+4010=10016(cost总值为25=玩家cost上限)

题解

知识点:背包dp。

一眼看上去像分组背包,但其实不是,因为从者、礼装没有明确分组。接下来,定义 \(a[i]\) 和 \(ac[i]\) 为从者的攻击力和花费,\(b[i]\) 和 \(bc[i]\) 为礼装的攻击力和花费。

设 \(dp[i][j][k]\) 为选了 \(i\) 个从者,\(j\) 个礼装,花费为 \(k\) 的最大攻击力。注意是选了,不是考虑到,因此每次考虑要更新所有。先处理选从者的,但没选礼装的所有情况,因为从者没有选的限制,但选礼装必须是选了从者的情况下有。有转移方程:

\[dp[k][0][j] = \max(dp[k][0][j],dp[k-1][0][j-ac[i]] + a[i])
\]

表示选 \(k\) 个的状态可以从选 \(k-1\) 的状态转移也可以不选,\(k\) 是 \([1,5]\) 都要跑一遍,因为最多选 \(5\) 个。

随后开始选礼装,有转移方程:

\[dp[k][u][j] = \max (dp[k][u][j],dp[k][u-1][j-bc[i]] +b[i])
\]

表示在选 \(k\) 个从者的情况下选 \(u\) 个礼装可以从选 \(k\) 个从者的情况下选 \(u-1\) 个礼装转移也可以不选,\(u\leq k\) 表示不能超过从者数量。

更新时,费用 \(j\) 这维要倒序,因为实际上这个状态已经滚动了考虑到某个礼装/从者一维,所以实际上是考虑到一维、选从者一维、选礼装一维、费用一维的高维背包dp,类似的有二维费用背包。

初始化负无穷,\(dp[0][0][0] = 0\) ,因为选择有严格数量限制,不能选空气。随后答案在 \(dp[i][j][k]\) 的所有状态里面的最大值。

时间复杂度 \(O(nd)\)

空间复杂度 \(O(d)\)

代码

#include <bits/stdc++.h>

using namespace std;

int a[307], ac[307], b[307], bc[307], dp[10][10][150];///表示选了i个从者,j个礼装,费用为k

int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m, d;
cin >> n >> m >> d;
for (int i = 1;i <= n;i++) cin >> a[i] >> ac[i];
for (int i = 1;i <= m;i++) cin >> b[i] >> bc[i];
memset(dp, -0x3f, sizeof(dp));///选从者的答案要严格保留
dp[0][0][0] = 0;
for (int i = 1;i <= n;i++)///考虑了第i个从者
for (int j = d;j >= ac[i];j--)///费用为j
for (int k = 1;k <= 5;k++)///选k个,一定放在费用下面,否则会重复选同一个
dp[k][0][j] = max(dp[k][0][j], dp[k - 1][0][j - ac[i]] + a[i]);///取费用为j,选k个的最优解
///因为礼装的选择只取决于从者的人数和对应费用和atk无关,因此对于两个状态相同的组合选最优的对礼装选择无影响
for (int i = 1;i <= m;i++)
for (int j = d;j >= bc[i];j--)
for (int k = 1;k <= 5;k++)
for (int u = 1;u <= k;u++)
dp[k][u][j] = max(dp[k][u][j], dp[k][u - 1][j - bc[i]] + b[i]);
int ans = 0;
for (int i = 0;i <= 5;i++)
for (int j = 0;j <= 5;j++)///可能一个礼装都选不了
for (int k = 0;k <= d;k++)
ans = max(ans, dp[i][j][k]);
cout << ans << '\n';
return 0;
}

NC14699 队伍配置的更多相关文章

  1. JavaScript中的表单编程

    表单编程 1获取表单相关信息 1.什么是表单元素 1.什么是表单元素 在H TML中表单就是指form标签,它的作用是将用户输入或选择的数据提交给指定的服务器 2.如何获取表单元素 <form ...

  2. acm pc^2的配置与使用

    -------------------------------------------------------------------------------------- !!! 转载请注明: 转自 ...

  3. Ubuntu下配置 keepalived+nginx+tomcat 负载均衡

    本文力图阐述在 Ubuntu Server 环境下使用 Keepalived + Nginx + Tomcat 搭建高可用负载均衡环境的操作步骤和简约配置,这里不涉及性能调优.先说一下他们各自扮演的角 ...

  4. (转载)vsftpd简易配置

    (转载)http://licong.blog.51cto.com/542131/145748/ 写篇关于vsftp配置的文章,加深自己的记忆,便于自己查阅,同时也希望能给其他需要的朋友一点借鉴.本文如 ...

  5. Gitlab-CI持续集成之Runner配置和CI脚本

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...

  6. [转]Gitlab-CI持续集成之Runner配置和CI脚本

    本文转自:https://www.cnblogs.com/jiukun/p/7481287.html 一.简介 1. 为实现持续集成,需为该项目准备以下两样东西: 1)软件集成脚本.(gitlab-c ...

  7. YUM仓库配置

    YUM的前身是YUP(Yellow dog Updater,Yellow dog Linux的软件更新器),最初由TSS公司(Terra Soft Solutions,INC.)使用Python语言开 ...

  8. 【nginx】配置Nginx实现负载均衡

    一文中已经提到,企业在解决高并发问题时,一般有两个方向的处理策略,软件.硬件,硬件上添加负载均衡器分发大量请求,软件上可在高并发瓶颈处:数据库+web服务器两处添加解决方案,其中web服务器前面一层最 ...

  9. IT运维队伍的管理

    如何建设一支能够解决问题.创造价值.有活力的.不断进取的IT运维团队,并带领这支团队,充分发挥这个团队的优势力量,是运维业务有效开展的关键.运维 策略是直接体现运维业务的经济价值所在.好的运维措施.方 ...

  10. log4j配置详解(非常详细)

    Log4J的配置文件(Configuration File)就是用来设置记录器的级别.存放器和布局的,它可接key=value格式的设置或xml格式的设置信息.通过配置,可以创建出Log4J的运行环境 ...

随机推荐

  1. AHB2APB设计

    AHB2APB Bridge位置 AHB子系统时钟在200Mhz左右,APB时钟在几十Khz到几十Mhz 所以要进行跨时钟域处理,从AHB高时钟频率转到APB低时钟频率 AHB2APB Bridge规 ...

  2. CDC设计实例-01

    CDC设计实例 Clock Gating Cell & Glitch Free Clock Switch(门控单元和动态切换时钟) 一个电路有多个时钟输入进来,希望在工作当中能够动态切换时钟; ...

  3. [转帖]tidb backup

    https://docs.pingcap.com/zh/tidb/v4.0/sql-statement-restore BACKUP 语句使用的引擎与 BR 相同,但备份过程是由 TiDB 本身驱动, ...

  4. [转帖]金仓数据库KingbaseES表空间介绍

    1.表空间的概念 KingbaseES中的表空间允许在文件系统中定义用来存放表示数据库对象的文件的位置.在KingbaseES中表空间实际上就是给表指定一个存储目录. 2.表空间的作用 通过使用表空间 ...

  5. [转帖]configure 各种配置

    https://api.dandelioncloud.cn/article/details/1487329970564485121 -build=编译该软件所使用的平台 -host=该软件将运行的平台 ...

  6. [转帖]iptables的四表五链与NAT工作原理

    本文主要介绍了iptables的基本工作原理和四表五链等基本概念以及NAT的工作原理. 1.iptables简介 我们先来看一下netfilter官网对iptables的描述: iptables is ...

  7. SQLSERVER2008R2 本地客户端无法连接的问题

    sqlserver 数据库无法连接问题. 1. 问题现象与简单分析 今天同事找我说一个 SQLSERVER2008R2的测试环境无法连接了. 提示信息为: 当时猜测是 数据库的 配置出问题了. 去查看 ...

  8. 【k哥爬虫普法】爬虫第一案,侵犯个人隐私,“入侵”短视频服务器!

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  9. ABP vNext系列文章04---DynamicClient动态代理

    一.动态代理在ABP系统中的应用 1.它主要在做什么事件 之前开发系统想要在后台调用别的服务都是用HttpClient发起请求,在abp vnext中不需要我们这样做了, 你只要知道服务调用的接口方法 ...

  10. 队列(Queue):先进先出(FIFO)的数据结构

    队列是一种基本的数据结构,用于在计算机科学和编程中管理数据的存储和访问.队列遵循先进先出(First In, First Out,FIFO)原则,即最早入队的元素首先出队.这种数据结构模拟了物理世界中 ...