先看题目:

描述

赛尔号是一款精灵养成游戏,勇敢机智的小赛尔需要收集许多的精灵并和他们成为朋友。

现在小赛尔有一只初始精灵皮皮来帮助小赛尔去抓捕其他精灵。

对于每一个野生小精灵而言,小赛尔可能需要使用很多个胶囊才能抓捕它,而在抓捕过程中,野生小精灵也会对皮皮造成一定的伤害(从而减少皮皮的生命值)。

如果皮皮的生命值小于等于0时,小赛尔就必须结束抓捕(皮皮可不能死啊),如果皮皮生命值小于等于0,则当前抓捕的野生小精灵会逃跑。

当小赛尔的胶囊用完时,抓捕也宣告结束。

如果小赛尔在某个星球遇到小精灵时可以采取以下两种模式:与之战斗然后抓捕它,否则就离开它选择其他的精灵。

如果小赛尔选择了抓捕,那么一定会使用能够抓捕该小精灵的胶囊,而皮皮也一定会受到相应的伤害;如果选择离开它,那么小赛尔不会损失胶囊,皮皮也不会损失生命值。

小赛尔的目标是收集更多的精灵,在这个前提下他希望他的小伙伴皮皮受到的伤害越小越好(剩余生命值越大),因为他们还要继续冒险。

现在已知小赛尔的胶囊数量和皮皮的初始生命值,已知每一个小精灵需要的用于抓捕的胶囊数目和它在被抓捕过程中会对皮皮造成的伤害数目。

小赛尔该如何抉择以达到他的目标呢?

输入

输入数据的第一行共有三个整数:A,S,D,代表小赛尔的胶囊数量、皮皮初始的生命值、野生小精灵的数量。

之后的D行,每一行代表一个野生小精灵,包括两个整数:抓捕该小精灵需要的胶囊的数量,以及抓捕过程中对皮皮造成的伤害。

输出

输出为一行,包含两个整数:G,T,分别表示最多抓捕G只精灵,和抓捕G只精灵时皮皮的剩余生命值最多为T。

输入样例 1

10 100 5
7 10
2 40
2 50
1 20
4 20

输出样例 1

3 30

首先确定这是一个类似于01背包的问题,但是多了一个限制条件。因此将一般01背包的二维数组改成三维数组,利用相同的思路求解:

import java.util.Scanner;
class Main {public static void main(String args[]){Scanner s = new Scanner(System.in);String input = s.nextLine();String[] inputs = input.split(" ");int[][] tasks = new int[Integer.parseInt(inputs[2])][2];int cap = Integer.parseInt(inputs[0]) + 1 , initheal = Integer.parseInt(inputs[1]);int[][][] dp = new int[Integer.parseInt(inputs[2])+1][cap+1][initheal+1];// Integer.parseInt(inputs[2])//总数for (int i = 0; i < Integer.parseInt(inputs[2]); i++) {String infos = s.nextLine();String[] info = infos.split(" ");tasks[i][0] = Integer.parseInt(info[0]);//胶囊数tasks[i][1] = Integer.parseInt(info[1]);//伤害}for (int i = 1; i < Integer.parseInt(inputs[2])+1 ; i++) {for (int j = 1; j < cap+1; j++) {for (int k = 1; k < initheal+1; k++) {dp[i][j][k] = dp[i-1][j][k];if( j > tasks[i-1][0] && k >= tasks[i-1][1]){dp[i][j][k] = Math.max(dp[i][j][k], dp[i-1][j-tasks[i-1][0]][k-tasks[i-1][1]] + initheal*Integer.parseInt(inputs[2]) + (initheal-tasks[i-1][1]));}}}}int max = dp[Integer.parseInt(inputs[2])][cap][initheal];System.out.println(max / (initheal*Integer.parseInt(inputs[2])) + " " + (initheal - ((max / (initheal*Integer.parseInt(inputs[2]))*initheal) - max % (initheal*Integer.parseInt(inputs[2])))));s.close();}
}

在提交的时候发现超内存了,这个时候就要想办法减少空间复杂度。于是就采用滚动数组的思想来进行降维,把三维数组降到二维数组:

import java.util.Scanner;
class Main {public static void main(String args[]){Scanner s = new Scanner(System.in);String input = s.nextLine();String[] inputs = input.split(" ");int[][] tasks = new int[Integer.parseInt(inputs[2])][2];int cap = Integer.parseInt(inputs[0]) + 1 , initheal = Integer.parseInt(inputs[1]);int[][] dp = new int[cap+1][initheal+1];// Integer.parseInt(inputs[2])//总数for (int i = 0; i < Integer.parseInt(inputs[2]); i++) {String infos = s.nextLine();String[] info = infos.split(" ");tasks[i][0] = Integer.parseInt(info[0]);//胶囊数tasks[i][1] = Integer.parseInt(info[1]);//伤害}for (int i = 1; i < Integer.parseInt(inputs[2])+1 ; i++) {for (int j = cap; j >= tasks[i-1][0]; j--) {for (int k = initheal; k >= tasks[i-1][1]; k--){dp[j][k] = Math.max(dp[j][k], dp[j-tasks[i-1][0]][k-tasks[i-1][1]] + initheal*Integer.parseInt(inputs[2]) + (initheal-tasks[i-1][1]));}}}int max = dp[cap][initheal];System.out.println(max / (initheal*Integer.parseInt(inputs[2])) + " " + (initheal - ((max / (initheal*Integer.parseInt(inputs[2]))*initheal) - max % (initheal*Integer.parseInt(inputs[2])))));s.close();}
}

最后成功解决问题

重游赛尔号-01背包的变种相关推荐

  1. 01背包及其变种(物品无限背包、恰好装满背包)

    一.01背包问题 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为C1,C2,-,Cn,与之相对应的价值为W1,W2,-,Wn.求解将那些物品装入背包可使总价值最大. 动态规划: ...

  2. 爆炸的符卡洋洋洒洒<每日一题>(01背包变种)

    题目: 题目链接:登录-专业IT笔试面试备考平台_牛客网 思路: 该题为01背包的变种问题 我们先来复习一下普通的01背包 dp[i][j]数组的含义: i代表了取前i个物品 j代表了背包的空间 数组 ...

  3. LeetCode 474. 一和零(01背包动态规划)

    1. 题目 在计算机界中,我们总是追求用有限的资源获取最大的收益. 现在,假设你分别支配着 m 个 0 和 n 个 1.另外,还有一个仅包含 0 和 1 字符串的数组. 你的任务是使用给定的 m 个 ...

  4. POJ2184 Cow Exhibition(DP:变种01背包)

    题意: 一群奶牛分别有s和f两个值,要求选出一些奶牛使s与f的和最大并且s和f分别的和不能为负数. 要点: 用dp[i]=j表示当s的和为i时f的和为j,这样最后只要求dp[i]+i的最大值即可.注意 ...

  5. 蓝桥杯每日真题之砝码称重(01背包)

    题面来源 2021年蓝桥省赛第一场G题 题面连接:http://acm.mangata.ltd/p/P1482 考点 01背包,动态规划 视频讲解 https://www.bilibili.com/v ...

  6. QAU 18校赛 J题 天平(01背包 判断能否装满)

    问题 J: 天平 时间限制: 1 Sec  内存限制: 128 MB 提交: 36  解决: 9 [提交][状态][讨论版][命题人:admin] 题目描述 天平的右端放着一件重量为w的物品.现在有n ...

  7. 动态规划-----------01背包,完全背包与多重背包

    P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有 ...

  8. 对01背包的分析与理解(图文)

    首先谢谢Christal_R的文章(点击转到链接)让我学会01背包 本文较长,但是长也意味着比较详细,希望您可以耐心读完. 题目: 现在有一个背包(容器),它的体积(容量)为V,现在有N种物品(每个物 ...

  9. dp之01背包hdu3466(带限制的,当你所拥有的钱数大于某个限定值时才可以购买该物品)...

    题意:买东西,每个东西有三个特征值,p代表价格,q代表你手中钱必须不低于q才能买这个物品,v代表得到的价值. mark:又是变种01背包,每做一个变种的,就是一种提高.. 按照q - p以由大到小的顺 ...

最新文章

  1. Asp.net设计模式笔记之一:理解设计模式
  2. 在阿里云服务器(Ubuntu系统)下使用WordPress搭建博客网站教程
  3. POJ2142-The Balance【扩欧】
  4. 虚拟机ping不通主机,但是主机可以ping通虚拟机(转载)
  5. redis scan 效率太慢_Redis 基础、高级特性与性能调优(下)
  6. CSS: hover选择器的使用
  7. 雨雪出行伴侣,优质PVC时尚鞋套,防滑/防水更耐磨
  8. winform实现简单的计算器V1版本
  9. matlab 建立ctruct,扩频通信系统及MATLAB仿真1
  10. 更改SQL数据库的繁体数据为简体
  11. 可以替代basemap的几个工具
  12. Apache JMeter web 应用测试工具使用快速入门
  13. Silverlight 4 全屏
  14. 2012-11-25 3:00 发喜讯,终于把S5pv210 VGA 分辨率提升到1440 x 900/1920 x 1080了!
  15. mac 环境下搭建socket通信
  16. Mac版Permute 3(万能视频转换器)
  17. ScreenToClient
  18. 点到平面的距离、向量与平面夹角
  19. 用JS实现贪吃蛇小游戏
  20. 洛谷题单难题总结——数组

热门文章

  1. 「可信计算」论文初步解读
  2. 校验两张BMP图像的RGB矩阵有多少个像素点不同
  3. 统计学基础专栏01---探索性数据分析
  4. git在工作中的正常使用
  5. Modern OpenGL - GLSL着色语言2:GLSL入口函数和GLSL中的变量
  6. LevelDB初体验 【转】
  7. java - JVM 线上服务的FGC问题排查
  8. 数字时代软件之角色?
  9. Flink-流平台调研
  10. 女孩子会因为什么喜欢一个男孩子?