题目链接:https://vjudge.net/problem/HDU-2159

FATE

                                                       Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
                                                                                    Total Submission(s): 17569    Accepted Submission(s): 8250

Problem Description
最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能升掉这最后一级吗?
Input
输入数据有多组,对于每组数据第一行输入n,m,k,s(0 < n,m,k,s < 100)四个正整数。分别表示还需的经验值,保留的忍耐度,怪的种数和最多的杀怪数。接下来输入k行数据。每行数据输入两个正整数a,b(0 < a,b < 20);分别表示杀掉一只这种怪xhd会得到的经验值和会减掉的忍耐度。(每种怪都有无数个)
Output
输出升完这级还能保留的最大忍耐度,如果无法升完这级输出-1。
Sample Input
10 10 1 10
1 1
10 10 1 9
1 1
9 10 2 10
1 1
2 2

Sample Output
0
-1
1
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[110][110];                    //dp[j][u]为最多杀j个怪且忍耐度最多为u时所能获得的最多经验int main()
{int n, m, s, k;while (cin >> n >> m >> k >> s){int a[110], b[110];for (int i = 0; i < k; i++)cin >> a[i] >> b[i];memset(dp, 0, sizeof(dp)); int x; int min = 0x3ffff;bool fp = false;for (int i = 0; i < k; i++){for (int j = 1; j <= s; j++)             //以下这两重循环为二维费用背包的两个限制条件,由于每种怪物有无数种,所以是正序(完全背包)
            {for (int u = b[i]; u <= m; u++){                             //其实将dp数组写成三维的更好理解,dp[i][j][u]杀前i种怪最多杀j个且忍耐度最多为u所能获得的最大经验dp[j][u] = max(dp[j][u], dp[j - 1][u - b[i]] + a[i]);      //其实可以将二维费用的形式和01背包的联系起来,更方便理解和记忆   if (dp[j][u] >= n&& min>u) {       min = u;                //因为要在保证升级的情况下,使剩下的忍耐度尽可能的大fp = true;      }}}}if (fp)cout << m - min << endl;elsecout << "-1" << endl;}return 0;
}

2018-05-16

转载于:https://www.cnblogs.com/00isok/p/9047654.html

HDU 2159 FATE【二维完全背包】相关推荐

  1. FATE HDU - 2159(二维完全背包)

    限制条件: 1.忍耐度 m   2.杀怪个数 s 构造: dp[m][s]   得到的经验值 Time limit       1000 ms Memory limit       32768 kB ...

  2. hdu 2159 FATE 二维背包

    FATE                                                                       Time Limit: 2000/1000 MS ...

  3. 第五讲 二维费用的背包问题 HD FATE(二维完全背包)

    FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. 背包模型dp2之二维费用背包

    二维费用背包 状态表示:f[i][j][k]所有只从前i个物体中选,并且总体积不超过j,总重量不超过k的选法状态表示:f[i][j][k]所有只从前i个物体中选,并且总体积不超过j,总重量不超过k的选 ...

  5. 【洛谷 - P1507 】NASA的食物计划(二维费用背包,dp)

    题干: 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力下终止了航天飞机的历史,但是此类事情会不会在以后发生,谁也无法保证,在遇到这类航天问题时, ...

  6. UVA 10306 e-Coins(二维完全背包)

    题意: 有n种物品,每种物品有两种价值x和y,并且每种物品的个数不限,求(x1 + x2 + -)^2 + (y1 + y2 + -) ^2 == S ^ 2 思路: 因为每种物品任意个,所以是二维完 ...

  7. UVA10306 - e-Coins(二维完全背包)

    题意:有n个物品,每个物品有两种价值x, y,每个物品的个数不限,求出(x1 + x2 + ...)^2 + (y1 + y2 + ...) ^2 == S ^ 2 思路:二维完全背包,因为物品个数不 ...

  8. 一本通 1271:【例9.15】潜水员(二维费用背包)

    [题目描述] 潜水员为了潜水要使用特殊的装备.他有一个带2种气体的气缸:一个为氧气,一个为氮气.让潜水员下潜的深度需要各种的数量的氧和氮.潜水员有一定数量的气缸.每个气缸都有重量和气体容量.潜水员为了 ...

  9. 【python】一篇讲透背包问题(01背包 完全背包 多重背包 二维费用背包)

    面对背包问题,有一个很重要的方程式:状态转移方程式 所以每一种背包问题我都会给出状态转移方程式 #01背包 什么是01背包型问题? 先给大家感受一下01背包型问题: 给定n种物品和一背包.物品i的重量 ...

最新文章

  1. 多角度人脸识别简单介绍
  2. opencv-python 9.4 拆分及合并图像通道
  3. Thymeleaf文档
  4. php中进制转换,php中进制转换
  5. Windows 服务(附服务开发辅助工具)
  6. webpack 4.0 配置文件 webpack.config.js文件的放置位置
  7. 『软件工程12』软件工程实践方法——软件测试
  8. APIGEE – API网关简介
  9. c# 找出目录下的所有子目录_C# 基础知识系列- 14 IO篇 文件的操作(2)
  10. 数学系鄙视物理系的经典桥段,全部看懂了算我输!
  11. 均值已知检验方差_方差分析
  12. sql截去最后一位_数据技能篇(EXCEL,SQL,Python)
  13. 2020 第十一届蓝桥杯大赛软件赛省赛(第一场),C/C++大学B组题解
  14. HFS远程命令执行漏洞入侵抓鸡黑阔服务器
  15. 生成大量随机数(c语言)
  16. 拓展显示器分辨率模糊(亲测,超级有用)
  17. 生成 8 / 16 / 32 位的UUID
  18. MySQL高可用和灾备调研
  19. 微信小程序获取urlScheme地址Python版
  20. jstree使用教程

热门文章

  1. 周鸿祎谈抢票:技术推动建立一个高效的公平社会
  2. c嵌入python类获取返回值
  3. 跑步机到了,看能坚持多久
  4. Verilog随机数生成$random
  5. anaconda程序组中的各个组件都是做什么用的
  6. php生成文字闪烁,如何用jquery实现闪烁文字效果
  7. python count()计算字符出现的频数
  8. 超级的全中文语音数据集合
  9. 人工智能写的散文之白色月光下
  10. jittor和pytorch生成网络对比之stargan