朝题夕解之动态规划(4)

简介: 朝题夕解之动态规划(4)

题目描述(题目难度:简单)


宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事。

一天,小智和皮卡丘来到了小精灵狩猎场,里面有很多珍贵的野生宠物小精灵。


小智也想收服其中的一些小精灵。

然而,野生的小精灵并不那么容易被收服。

对于每一个野生小精灵而言,小智可能需要使用很多个精灵球才能收服它,而在收服过程中,野生小精灵也会对皮卡丘造成一定的伤害(从而减少皮卡丘的体力)。

当皮卡丘的体力小于等于0时,小智就必须结束狩猎(因为他需要给皮卡丘疗伤),而使得皮卡丘体力小于等于0的野生小精灵也不会被小智收服。

当小智的精灵球用完时,狩猎也宣告结束。

我们假设小智遇到野生小精灵时有两个选择:收服它,或者离开它。

如果小智选择了收服,那么一定会扔出能够收服该小精灵的精灵球,而皮卡丘也一定会受到相应的伤害;如果选择离开它,那么小智不会损失精灵球,皮卡丘也不会损失体力。

小智的目标有两个:主要目标是收服尽可能多的野生小精灵;如果可以收服的小精灵数量一样,小智希望皮卡丘受到的伤害越小(剩余体力越大),因为他们还要继续冒险。

现在已知小智的精灵球数量和皮卡丘的初始体力,已知每一个小精灵需要的用于收服的精灵球数目和它在被收服过程中会对皮卡丘造成的伤害数目。


请问,小智该如何选择收服哪些小精灵以达到他的目标呢?


输入格式

输入数据的第一行包含三个整数:N,M,K,分别代表小智的精灵球数量、皮卡丘初始的体力值、野生小精灵的数量。


之后的K行,每一行代表一个野生小精灵,包括两个整数:收服该小精灵需要的精灵球的数量,以及收服过程中对皮卡丘造成的伤害。


输出格式

输出为一行,包含两个整数:C,R,分别表示最多收服C个小精灵,以及收服C个小精灵时皮卡丘的剩余体力值最多为R。


数据范围

0<N NN≤1000,

0<M MM≤500,

0<K KK≤100

输入样例1:

10 100 5

7 10

2 40

2 50

1 20

4 20

输出样例1:

3 30

输入样例2:

10 100 5

8 110

12 10

20 10

5 200

1 110

输出样例2:

0 100


原题传送门


解题报告


DP分析


看到题目中提到收服或者离开的时候,

微信图片_20221018143955.png

心中大抵可以向01背包的方向靠近了。

但是这道题比较妖艳的是它有两个费用的消费:

花费1:精灵球数量

花费2:皮卡丘体力值

价值:小精灵的数量(每只精灵价值为1)微信图片_20221018144018.jpg

总和可以得到状态转移方程

f [ i , j , k ] = m a x ( f [ i − 1 , j , k ] , f [ i − 1 , j − v 1 [ i ] , k − v 2 [ i ] + w ) f[i,j,k] = max(f[i-1,j,k],f[i-1,j - v1[i],k - v2[i] + w)f[i,j,k]=max(f[i−1,j,k],f[i−1,j−v1[i],k−v2[i]+w)

w ww表示的是价值,在这个集合中就是代表能抓捕的梦可宝的数量,每只梦可宝都是独立的,所以w ww = 1


注意


因为题目中强调的,皮神的体力值小于等于0的时候,是无法收服的,所以在枚举以及使用皮神的血量去战斗的时候,最多只能用皮神总血量m mm-1滴血。


明白集合f [ i , j ] f[i,j]f[i,j]到底想计算什么,表示什么,不然会影响答案输出

例如最后输出答案的代码的意思就是:微信图片_20221018144047.png

在最多使用n个精灵球,最多用掉皮神m-1滴血的时候,能捕获到的梦可宝的最大数量。


参考代码

#include <iostream>
#include <algorithm>
using namespace std;
//N,M,K,分别代表小智的精灵球数量、皮卡丘初始的体力值、野生小精灵的数量。
const int N = 1010 , M = 510;
//收服该小精灵需要的精灵球的数量,以及收服过程中对皮卡丘造成的伤害
int v1[N],v2[N];
int n,m,k;
/*
花费1:精灵球数量
花费2:皮卡丘体力值
*/
int f[N][M];//直接写优化为二维的代码了,正常来说是三维的
int main()
{
    cin >> n >> m >> k;
    //输入这些小精灵需要的球个数以及对皮神的伤害
    for(int i = 1; i <=  k;i++) cin >> v1[i] >> v2[i];
    //01背包处理这k只梦可宝
    for(int i = 1; i <= k; i++)
        //在精灵球足够
        for(int j = n; j >= v1[i];j--)
        //皮神还有战斗力
        for(int a = m-1; a >= v2[i];a--) f[j][a] = max(f[j][a],f[j-v1[i]][a - v2[i]] + 1);
    cout << f[n][m-1]<< ' ';
    //在这些方案找,找到可以使皮神掉血最少的方案
    int res = m;//默认假设皮神拿所有血去打
    //注意这里从0开始测试皮神的血,0的意思就是不打任何一只精灵
    for(int k = 0; k <= m -1;k++)
        if(f[n][k] == f[n][m-1]) res = min(res,k);
    cout << m -  res << endl;
    return 0;
}


相关文章
|
数据库
PowerDesigner添加表注释
之前同事用PowerDesigner 建立数据模型后,生成到数据库中,没有注释。这导致数据库使用起来不是很方便,特别是对数据表结构不熟悉的同事。 其实,可以添加注释(并且可以逆向,即从数据库中反向更新到PDM中),方法也很简单: 在任意表上右键-属性-Columns,面板工具栏中选择Cutomize Columns and Filter(快捷键Ctrl+U),弹出对话框,勾选Comment即可。
1874 0
|
网络安全 数据安全/隐私保护
百度搜索:蓝易云【多个端口怎么运行SSH服务器?】
记得替换 `username`为你的用户名,`your_server_ip`为你的服务器IP地址。根据需要,可以添加其他端口并进行相应的配置。
321 0
|
数据安全/隐私保护
「域渗透」域账户的几种攻击方式
「域渗透」域账户的几种攻击方式
|
Ubuntu Unix Linux
Ubuntu 开机启动脚本配置
本文基于Ubuntu 20.04 LTS版本用实例来讲解如何配置开机自启动服务。
1297 1
Ubuntu 开机启动脚本配置
|
11月前
|
缓存 API 数据安全/隐私保护
自学记录:学习HarmonyOS Location Kit构建智能定位服务
作为一名对新技术充满好奇心的开发者,我选择了HarmonyOS Next 5.0.1(API 13)作为挑战对象,深入研究其强大的定位服务API——Location Kit。从权限管理、获取当前位置、逆地理编码到地理围栏,最终成功开发了一款智能定位应用。本文将结合代码和开发过程,详细讲解如何实现这些功能,并分享遇到的挫折与兴奋时刻。希望通过我的经验,能帮助其他开发者快速上手HarmonyOS开发,共同探索更多可能性。
467 5
|
9月前
|
消息中间件 安全 Java
VCTGO:一款让开发者直呼“真香”的企业级快速开发平台,你绝对不能错过!
嗨,大家好,我是小华同学。关注我们获取“最新、最全、最优质”的开源项目和高效工作学习方法。今天为大家介绍一款企业级快速开发平台——VCTGO。基于Spring Boot + Vue.js,VCTGO提供用户管理、菜单管理、角色管理、日志管理、代码生成、系统监控等核心功能,支持从开发到部署的一站式解决方案。技术架构采用主流技术栈,包括前端Vue.js + Element UI,后端Spring Boot + MyBatis Plus,数据库MySQL,缓存Redis,消息队列RabbitMQ,
263 27
|
10月前
|
固态存储 虚拟化 iOS开发
VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS NVMe 驱动特殊定制版 (集成驱动版)
VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS NVMe 驱动特殊定制版 (集成驱动版)
546 33
VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS NVMe 驱动特殊定制版 (集成驱动版)
|
安全 算法 Java
CAS是"Compare and Swap"(比较并交换)
CAS是"Compare and Swap"(比较并交换)的缩写,是一种多线程同步的原子操作。它基于硬件的原子性保证,用于解决并发环境下的数据竞争和线程安全问题。
297 0
|
Linux 知识图谱
Centos7安装killall,fuser, killall,pstree和pstree.x11
通过上述步骤,您已在CentOS 7系统中成功部署了killall、fuser、pstree以及pstree.x11,为高效管理系统进程打下了坚实基础。更多关于服务器管理与优化的知识,获取全面技术支持与解决方案。
497 1
|
安全 Shell 网络安全
Neos的渗透测试靶机练习——DC-1
Neos的渗透测试靶机练习——DC-1
226 4