题目地址:

https://www.acwing.com/problem/content/1024/

宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事。一天,小智和皮卡丘来到了小精灵狩猎场,里面有很多珍贵的野生宠物小精灵。小智也想收服其中的一些小精灵。然而,野生的小精灵并不那么容易被收服。对于每一个野生小精灵而言,小智可能需要使用很多个精灵球才能收服它,而在收服过程中,野生小精灵也会对皮卡丘造成一定的伤害(从而减少皮卡丘的体力)。当皮卡丘的体力小于等于 0 0 0时,小智就必须结束狩猎(因为他需要给皮卡丘疗伤),而使得皮卡丘体力小于等于 0 0 0的野生小精灵也不会被小智收服。当小智的精灵球用完时,狩猎也宣告结束。我们假设小智遇到野生小精灵时有两个选择:收服它,或者离开它。如果小智选择了收服,那么一定会扔出能够收服该小精灵的精灵球,而皮卡丘也一定会受到相应的伤害;如果选择离开它,那么小智不会损失精灵球,皮卡丘也不会损失体力。小智的目标有两个:主要目标是收服尽可能多的野生小精灵;如果可以收服的小精灵数量一样,小智希望皮卡丘受到的伤害越小(剩余体力越大),因为他们还要继续冒险。现在已知小智的精灵球数量和皮卡丘的初始体力,已知每一个小精灵需要的用于收服的精灵球数目和它在被收服过程中会对皮卡丘造成的伤害数目。请问,小智该如何选择收服哪些小精灵以达到他的目标呢?

输入格式:
输入数据的第一行包含三个整数: N N N, M M M, K K K,分别代表小智的精灵球数量、皮卡丘初始的体力值、野生小精灵的数量。之后的 K K K行,每一行代表一个野生小精灵,包括两个整数:收服该小精灵需要的精灵球的数量,以及收服过程中对皮卡丘造成的伤害。

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

数据范围:
0 < N ≤ 1000 0<N≤1000 0<N≤1000
0 < M ≤ 500 0<M≤500 0<M≤500
0 < K ≤ 100 0<K≤100 0<K≤100

这是个二维费用的 0 − 1 0-1 0−1背包问题,可以用动态规划来做。设 f [ i ] [ j ] [ l ] f[i][j][l] f[i][j][l]是如果只收服前 i i i个野生小精灵,并且使用不超过 j j j个精灵球、皮卡丘消耗的体力也小于等于 l l l的情况下,能收服的最多的小精灵数。那么可以按照第 i i i个野生小精灵是否收服来分类,如果不收服,则答案是 f [ i − 1 ] [ j ] [ l ] f[i-1][j][l] f[i−1][j][l];如果收服,则答案是 f [ i − 1 ] [ j − v 1 [ i ] ] [ l − v 2 [ i ] ] f[i-1][j-v_1[i]][l-v_2[i]] f[i−1][j−v1​[i]][l−v2​[i]],其中 v 1 [ i ] v_1[i] v1​[i]和 v 2 [ i ] v_2[i] v2​[i]分别表示该野生小精灵消耗的精灵球数和皮卡丘体力。代码如下:

#include <iostream>
using namespace std;const int N = 1010, M = 510, K = 110;
int n, m, k;
// v1是消耗精灵球数量,v2是消耗皮卡丘的体力
int v1[K], v2[K];
// 可以滚动数组优化空间
int f[2][N][M];int main() {// n是精灵球数量,m是皮卡丘体力值,k是野生小精灵数量cin >> n >> m >> k;for (int i = 1; i <= k; i++) scanf("%d%d", &v1[i], &v2[i]);for (int i = 1; i <= k; i++)for (int j = 0; j <= n; j++)// 消耗不能超过m - 1,因为最后皮卡丘的体力不能为0for (int l = 0; l < m; l++) {// 枚举不收服第i个小精灵的情形f[i & 1][j][l] = f[i - 1 & 1][j][l];// 枚举收服第i个小精灵的情形if (j >= v1[i] && l >= v2[i])f[i & 1][j][l] = max(f[i & 1][j][l], f[i - 1 & 1][j - v1[i]][l - v2[i]] + 1);}int t = m - 1;while (t > 0 && f[k & 1][n][t - 1] == f[k & 1][n][m - 1]) t--;printf("%d %d\n", f[k & 1][n][m - 1], m - t);return 0;
}

时间复杂度 O ( N M K ) O(NMK) O(NMK),空间 O ( N M ) O(NM) O(NM)。

【ACWing】1022. 宠物小精灵之收服相关推荐

  1. AcWing 1022 宠物小精灵之收服

    题目描述: 宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事. 一天,小智和皮卡丘来到了小精灵狩猎场,里面有很多珍贵的野生宠物小精灵. 小智也想收服其中的一些小精灵.然而,野生的小精灵并不那么容 ...

  2. AcWing 1022. 宠物小精灵之收服

    m-1是因为皮卡丘血量要大于0,最多损血m-1 第二问皮卡丘最大剩余体力 dp[n][m - 1]:在所有小精灵中使用全部的精灵球且皮卡丘不挂的前提下所能捕捉小精灵的最大数量 因为要是皮卡丘剩余体力最 ...

  3. 1022. 宠物小精灵之收服

    1022. 宠物小精灵之收服 题意: 现在有n个胶囊,m个生命值,k个怪物,每个怪物需要a[i]个胶囊,且会造成b[i]个伤害后才能捕获,问在活着的前提下,最多捕获多少怪物,在怪物最多的情况下剩余生命 ...

  4. 【acwing】1022. 宠物小精灵之收服*(二维价值的01背包)

    穿越隧道 三维状态表示 超内存了..哭,思路应该没问题吧. 求大佬指正. #include <bits/stdc++.h> using namespace std; const int N ...

  5. 《信息学奥赛一本通》宠物小精灵之收服

    题目链接: 1022. 宠物小精灵之收服 - AcWing题库 宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事.一天,小智和皮卡丘来到了小精灵狩猎场,里面有很多珍贵的野生宠物小精灵.小智也想收 ...

  6. [01背包] 宠物小精灵之收服(01背包+二维费用背包+思维)

    文章目录 0. 前言 1. 01背包裸题 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包裸题 1022. 宠物小精灵之收服 每个精灵仅被收服一次,故可以考虑 01 背包,是典型 ...

  7. Bailian4102 宠物小精灵之收服【模拟】

    4102:宠物小精灵之收服 总时间限制: 1000ms 内存限制: 65536kB 描述 宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事. 一天,小智和皮卡丘来到了小精灵狩猎场,里面有很多珍贵 ...

  8. 动态规划——1292:宠物小精灵之收服(二维背包问题)

    1292:宠物小精灵之收服 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6298 通过数: 3921 [题目描述] 宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事. 一 ...

  9. OpenJudgeNOI4978 宠物小精灵之收服

    4978:宠物小精灵之收服 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事. 一天,小智和皮卡丘来到了 ...

最新文章

  1. 驱动开发中使用安全字符串函数
  2. Laravel 5.5 的错误异常处理机制以及应用实例
  3. 电脑无故弹出yyy102.html网页的解决办法(没办法,今天中招了)
  4. [react] 如何给非控组件设置默认的值?
  5. 前端学习(2044)vue之电商管理系统电商系统之优化configwebpack和chainwebpack
  6. java定义private_java9开始——接口中可以定义private私有方法
  7. 计算机环境安全服务未启动,windows10系统卡在“准备安全选项”如何解决
  8. 塔拉 孤岛危机2_《孤岛危机》新作爆料!类似于《绝地求生》的多人游戏
  9. GetModuleHandle
  10. php删除数组中的空行,php处理文件的思考(去除空行、每行多余字符)
  11. php调用mysql中文变量_用php调用MySQL里的数据,为什么汉字都变成了问号?在线等...
  12. 100%快速解决谷歌翻译无法使用的问题,附修复工具
  13. 计算机打游戏的硬件,玩电脑常见的六大误区 看看你犯了几条
  14. 基于Arduino的智能家居系统设计
  15. 用css实现朋友圈图片布局
  16. 美图公司FinOps探索的那些事儿~
  17. intellij 取消svn 用户名 密码
  18. Multisim基础 交流电源AC的Voltage offset的含义
  19. windows 2008 r2 sharepoint 2007 文档库 在windows资源管理器打开问题
  20. 《JavaScript高级编程》HTML中的JavaScript

热门文章

  1. 梅科尔工作室-梁嘉莹-鸿蒙笔记2
  2. 几行JS代码防止网站在QQ和微信被举报
  3. Java学习笔记-@RunWith(SpringRunner.class)
  4. 天下无贼是假的,天下无票倒是真的;如来神掌是假功夫,能买到车票才是真功夫。
  5. 树莓派sd卡格式化_利用树莓派和移动硬盘搭建下载机,常见视频网站都可下载...
  6. 重庆APP开发价格费用如何计算?
  7. 玉米生吃好还是熟吃好 各种情况分析
  8. 北京五险一金介绍及公积金领取办法
  9. python-字符串格式化(万古枯)
  10. 软件测试拿了几个20K offer,分享一波面经