1292:宠物小精灵之收服

【算法分析】

该问题为二维费用背包。精灵球数量、皮卡丘体力值都是费用。

题目说,如果一个野生小精灵让皮卡丘的体力小于等于0,那么无法收服该小精灵。也就是说当皮卡丘有m点体力时,最多可以消耗的体力为m-1点。在输入m后,先让m--,此时m表示最多可以消耗的体力值。

1. 状态定义

状态定义:dp[i][j][k]:在前i个野生小精灵中选择小精灵捕捉,最多使用j个精灵球,以及k点皮卡丘的体力值,能捕捉到的最多的小精灵的数量。

2. 状态转移方程

记:b[i]:收第i小精灵需要的精灵球数, d[i]:收服第i小精灵皮卡丘损失的体力值

子集1:如果捕捉第i小精灵,接下来需要在前i-1个小精灵中选择小精灵,最多使用j-b[i]个精灵球,皮卡丘最多消耗k-d[i]点体力值,在这种情况下能够捕捉到的小精灵数量最多为dp[i-1][j-b[i]][k-d[i]],加上刚刚捉到的1只,所以dp[i][j][k] = dp[i-1][j-b[i]][k-d[i]]+1

子集2:如果不捕捉第i小精灵,接下来需要在前i-1个野生小精灵中选择,最多使用j个精灵球,以及k点皮卡丘的体力值,可以捕捉到的小精灵数量最多为dp[i][j][k] = dp[i-1][j][k]

以上两种情况取最大值

3. 获取剩余体力

第二个问要求的是,在收服最多小精灵的前提下,皮卡丘可以剩余的最多体力。

假设最多有n个精灵球,皮卡丘最多可以消耗m点体力(这是m--后的m,实际总体力值为m+1),一共有ka个野生小精灵。那么在所有野生小精灵中,选择要捕获的小精灵,最多消耗n个精灵球和m点皮卡丘的体力,能获得的最多的小精灵的数量为dp[ka][n][m]。如果不消耗m点体力,而是消耗k点皮卡丘的体力(0 ≤ k ≤ m 0\le k \le m0≤k≤m),看在捕获的小精灵数量相同的情况下,k最小可以是几。也就是说,在所有小精灵中选择小精灵捕获,消耗n个精灵球,要捕获数量为dp[ka][n][m]的小精灵,皮卡丘最少消耗的体力可以是多少。

k从0遍历到m,如果dp[ka][n][k] == dp[ka][n][m],那么最少消耗k点体力,就可以捕获到最多的小精灵。剩下的体力值应该为m+1-k(因为m是最多可以消耗的体力值,总体力值实际为m+1)。

4. 复杂度优化

根据该题的描述,dp[i][j][k]第1维是小精灵数量,最大100;第2维是精灵球个数,最大1000;第3维是皮卡丘体力值,最大500。乘在一起为这个三维数组的最大变量数,为5 ∗ 1 0^7,内存空间限制为65535KB,65535 ∗ 1024 / 4 = 16776960,最多可以保存约1.67 ∗ 1 0^7 个int类型的变量。如果直接声明三维数组使用,一定会内存超限。因此对于该题,必须做滚动数组优化,去掉表示前几个小精灵的第一维。

【参考代码】

#include <bits/stdc++.h>
using namespace std;
int dp[1005][505];//dp[i][j][k]:(第一维i被优化掉)前i个野生小精灵中最多使用j个精灵球,k点皮卡丘的体力值,能捕捉到的最大小精灵数量。 
int b[105], d[105];//b[i]:收第i小精灵需要的精灵球球数 d[i]:收第i小精灵皮卡丘损失的体力值 
int main()
{int n, m, ka, r;cin >> n >> m >> ka;//n个精灵球 皮卡丘m点体力值 野生小精灵有ka个 m--;//不能把m点体力值都用完,最多可以使用m-1点体力 for(int i = 1; i <= ka; ++i)cin >> b[i] >> d[i];for(int i = 1; i <= ka; ++i)for(int j = n; j >= b[i]; --j)for(int k = m; k >= d[i]; --k)dp[j][k] = max(dp[j][k], dp[j-b[i]][k-d[i]]+1);for(int k = 0; k <= m; ++k)//用掉的体力值可以为0,从0开始遍历 {if(dp[n][k] == dp[n][m]){r = m + 1 - k ;//原总体力值为m+1,减去用掉的体力j break;}   }cout << dp[n][m] << ' ' << r;return 0; 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/189767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自然语言处理 (NLP) 中的组合语义分析

埃弗顿戈梅德&#xff08;Everton Gomede&#xff09; 一、介绍 自然语言处理 &#xff08;NLP&#xff09; 中的组合语义分析是一个引人入胜且复杂的话题。为了充分理解它&#xff0c;将这个概念分解成它的基本组成部分是至关重要的&#xff1a;组合语义及其在NLP中的应用。组…

零售数字化“逆熵”的6项原则和8种能力建设|ShopeX徐礼昭

作者&#xff1a;徐礼昭 来源&#xff1a;《三体零售逆熵法则》节选 旧的规则与秩序被打破&#xff0c;无序成为常态 新时代洪流裹挟冲击着传统零售 无序带来的“熵增”侵蚀企业生命 所有人都在不确定性中寻找确定 数字化如何助力企业铸就「反熵增」神器&#xff1f; 如何…

uniapp设置手机通知权限以及uniapp-push2.0推送

unipush2.0代码 export default function () {// 调用获取用户通知权限setPermissions()// 获取客户端唯一的推送标识&#xff0c;可用于测试uni.getPushClientId({success: (res) > {console.log(res.cid)},fail(err) {console.log(err)}})// 监听推送uni.onPushMessage(r…

设计模式之美学习笔记-单例模式-为什么说支持懒加载的双重检测不比饿汉式更优?

单例设计模式&#xff1a;一个类只允许创建一个对象&#xff08;或者实例&#xff09;&#xff0c;那这个类就是一个单例类&#xff0c;这种设计模式就叫作单例设计模式&#xff0c;简称单例模式。 实战案例一&#xff1a;处理资源访问冲突 我们先来看第一个例子。在这个例子…

第十节HarmonyOS 常用基础组件-Image

一、组件介绍 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声名式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类&#xff1a;基础组件…

VB.NET二维数组的组合

缘由https://bbs.csdn.net/topics/397512167 首先写了自上而下的查找&#xff0c;在此基础上再加逻辑控制以达到目标。 Sub 四维组合()Dim wei4 {{4, 5, 6, 7}, {1, 2, 4, 8}, {9, 10, 11, 12}, {3, 13, 21, 22}}Dim j 1, h 0, f 0, zc wei4(0, f)Dim sc ""Whi…

xss漏洞后端进行html消毒

import org.jsoup.Jsoup;public static String sanitizeHtml(String input) {// 使用 Jsoup 消毒 HTMLreturn Jsoup.clean(input, Safelist.relaxed());}public static void main(String[] args) {String userInput "<p><script>alert(1)</script>Safe…

海外IP罗拉rola正版去哪里找?

免费海外IP代理能用吗&#xff1f;和收费的有哪些差异&#xff1f; 如今在这个大数据时代&#xff0c;无论你从事哪个行业&#xff0c;都离不开数据&#xff0c;尤其是做跨境电商的&#xff0c;更一步都离不开海外IP代理&#xff0c;无论是网站引擎优化还是营销推广、数据抓取…

LeetCode105.从前序和中序遍历序列构造二叉树

这道题看完题想了几分钟就想到大概的思路了&#xff0c;但是在写的时候有很多细节没注意出了很多问题&#xff0c;然后写了1个多小时&#xff0c;其实这道题挺简单的。 首先&#xff0c;最基本的知识&#xff0c;先序遍历是根左右&#xff0c;中序遍历是左根右&#xff0c;那么…

集简云语聚AI新增模型测试,支持多模型同时进行交互,快速评估不同模型性能

语聚AI模型测试 在ChatGPT爆火的推动下&#xff0c;由生成式 AI 掀起的全球人工智能新浪潮就此拉开了序幕&#xff0c;人工智能也成为越来越多企业提升业务效率、优化业务流程的首选方案。 然而&#xff0c;面对层出不穷的AI模型&#xff0c;每个模型在完善度、功能性、易用性…

【算法每日一练]-图论(保姆级教程篇10 并查集)#POJ1988 #POJ1182

目录 POJ1988 思路&#xff1a; POJ1182 思路&#xff1a; POJ1988 有n个栈每个栈中有一个方块&#xff0c;现要执行n次操作。一种是移数&#xff0c;一种是计数 移数M&#xff1a;把包含x的栈整体移动到y栈顶 计数C&#xff1a;统计X方块下面的方块数 输入&#xff1a; 6 …

Pandas进阶:分类数据处理

引言 category是pandas的一种分类的定类数据类型。和文本数据.str.<methond>一样&#xff0c;它也有访问器功能.cat.<method>。 本文将介绍&#xff1a; 什么是分类数据&#xff1f; 分类数据cat的处理方法 为什么要使用分类数据&#xff1f; 分类数据cat使用…

Vue系列:页面中图片等静态资源引用

前言 近期在做项目时遇到一些图片、视频、动态图片等静态资源的使用&#xff0c;在vue页面jsx、tsx中使用的时候遇到些问题&#xff1b; 对静态资源的引用使用总结如下 引入方式说明 以下代码实例以图片、vue环境为例&#xff0c;不放视屏等引入实例&#xff0c;视频使用方式…

C++标准模板(STL)- 类型支持 (杂项变换,定义适于用作给定大小的类型的未初始化存储的类型,std::aligned_storage)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实…

记录5款NodeJS后端框架

文章目录 前言一、Express二、Nest.js三、Meteor四、Koa.js五、Fastify 前言 https://xie.infoq.cn/article/d8c2cd9cb99a04cbbf0a45434 https://juejin.cn/post/6959583458779725860 Nodejs 框架分为三种类型&#xff1a; MVCREST APIFull-Stack 一、Express Express 是最…

uni-app 微信小程序 电子签名及签名图片翻转显示功能

文章目录 1. 需求背景2. 开始撸2.1 点击 重写 进入签名页面&#xff08;上图一&#xff09;2.2 书写签名&#xff0c;点击确认返回&#xff0c;及图片翻转显示&#xff08;上图二&#xff0c;三&#xff09; 3. 图片进行翻转&#xff0c;返回翻转后的图片 1. 需求背景 接的一个…

Hdoop学习笔记(HDP)-Part.6 安装OracleJDK

六、安装OracleJDK 下载jdk安装文件&#xff0c;放到/opt中&#xff0c;将文件解压到/usr/local下后&#xff0c;修改/etc/profile文件中环境参数&#xff0c;实现java的安装。 创建jdk.yml文件 ---- hosts: alltasks:- name: copy and unzip jdkunarchive:src: "/opt/j…

C++学习之路(十五)C++ 用Qt5实现一个工具箱(增加16进制颜色码转换和屏幕颜色提取功能)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《Base64图片编码预览功能》功能。为了继续丰富我们的工具箱&#xff0c;今天我们就再增加两个平时经常用到的功能吧&#xff0c;就是「 16进制颜色码转RGB文本 」和 「屏幕颜色提取」功能。下面我们就来看看如何来规划…

深入解析SpringBoot的请求响应机制

SpringBootWeb请求响应 前言1. 请求1.1 Postman介绍 1.2 简单参数1.2.1 原始方式1.2.2 SpringBoot方式1.2.3 参数名不一致 1.3 实体参数1.3.1 简单实体对象1.3.2 复杂实体对象 1.4 数组集合参数1.4.1 数组1.4.2 集合 1.5 日期参数1.6 JSON参数1.7 路径参数 2. 响应2.1 Response…

电子学会C/C++编程等级考试2021年06月(四级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字三角形问题 (图1) 图1给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 注意:路径上的每一步只能从一个数走到下一层上和它…