题目:

最近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

题解:

因为求最大经验,所以dp数组初始化为0

dp[i][j]表示消耗忍耐度i,杀怪数量小于等于j所获得的最大经验(实现杀怪数量小于等于j在于转移方程,可以模拟一下)

 1 for(int i=0; i<k; ++i)
2 {
3 for(int j=b[i]; j<=m; ++j)
4 {
5 for(int x=1; x<=s; ++x)
6 {
7 /*
8 比如枚举到第一个怪a[i]=5,b[i]=5,那么dp[5-m][1]=5;
9 这个时候dp[5-m][2]也被赋值为5了
10 */
11 if(dp[j][x]<dp[j-b[i]][x-1]+a[i])
12 {
13 dp[j][x]=dp[j-b[i]][x-1]+a[i];
14 }
15 }
16 }
17 }

dp转移方程dp[j][x]=max(dp[j][x],dp[j-b[i]][x-1]+a[i])      //a[i]为第i种怪消耗的忍耐度

因为我们最后要求出来最大经验够不够n,所以最后让dp[m][s]与n比较大小就行

代码:

 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<math.h>
6 #include<vector>
7 #include<queue>
8 #include<stack>
9 #include<map>
10 using namespace std;
11 typedef long long ll;
12 const int maxn=110;
13 const int INF=0x3f3f3f3f;
14 const double eps=1e-10;
15 const int mod = 1e9+7;
16 #define mt(A,B) memset(A,B,sizeof(A))
17 #define lson l,m,rt*2
18 #define rson m+1,r,rt*2+1
19 int a[maxn],b[maxn],dp[maxn][maxn];
20 int main()
21 {
22 int n,m,k,s;
23 while(~scanf("%d%d%d%d",&n,&m,&k,&s))
24 {
25 for(int i=0; i<k; ++i)
26 {
27 scanf("%d%d",&a[i],&b[i]);
28 }
29 memset(dp,0,sizeof(dp));
30 for(int i=0; i<k; ++i)
31 {
32 for(int j=b[i]; j<=m; ++j)
33 {
34 for(int x=1; x<=s; ++x)
35 {
36 /*
37 比如枚举到第一个怪a[i]=5,b[i]=5,那么dp[5-m][1]=5;
38 dp[5-m][2]也被赋值为5了
39 */
40 if(dp[j][x]<dp[j-b[i]][x-1]+a[i])
41 {
42 dp[j][x]=dp[j-b[i]][x-1]+a[i];
43 }
44 }
45 }
46 }
47 if(dp[m][s]>=n)
48 {
49 for(int i=0; i<=m; ++i)
50 {
51 if(dp[i][s]>=n)
52 {
53 printf("%d\n",m-i);
54 break;
55 }
56 }
57 }
58 else
59 printf("-1\n");
60 }
61
62 return 0;
63 }

HDU - 2159 dp的更多相关文章

  1. HDOJ(HDU).2159 FATE (DP 带个数限制的完全背包)

    HDOJ(HDU).2159 FATE (DP 带个数限制的完全背包) 题意分析 与普通的完全背包大同小异,区别就在于多了一个个数限制,那么在普通的完全背包的基础上,增加一维,表示个数.同时for循环 ...

  2. HDU 2159 FATE(二维费用背包)

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

  3. 背包系列练习及总结(hud 2602 && hdu 2844 Coins && hdu 2159 && poj 1170 Shopping Offers && hdu 3092 Least common multiple && poj 1015 Jury Compromise)

    作为一个oier,以及大学acm党背包是必不可少的一部分.好久没做背包类动规了.久违地练习下-.- dd__engi的背包九讲:http://love-oriented.com/pack/ 鸣谢htt ...

  4. hdu 3016 dp+线段树

    Man Down Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  5. HDU 5928 DP 凸包graham

    给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...

  6. HDU 2159 FATE (DP 二维费用背包)

    题目链接 题意 : 中文题不详述. 思路 : 二维背包,dp[i][h]表示当前忍耐值为i的情况下,杀了h个怪得到的最大经验值,状态转移方程: dp[i][h] = max(dp[i][h],dp[i ...

  7. HDU 2159 FATE (dp)

    FATE Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  8. HDU 2159 FATE (dp)

    题目链接 Problem Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最 ...

  9. HDU - 2159 FATE(二维dp之01背包问题)

    题目: ​ 思路: 二维dp,完全背包,状态转移方程dp[i][z] = max(dp[i][z], dp[i-1][z-a[j]]+b[j]),dp[i][z]表示在杀i个怪,消耗z个容忍度的情况下 ...

随机推荐

  1. TCP/IP协议栈在Linux内核中的运行时序分析

    网络程序设计调研报告 TCP/IP协议栈在Linux内核中的运行时序分析 姓名:柴浩宇 学号:SA20225105 班级:软设1班 2021年1月 调研要求 在深入理解Linux内核任务调度(中断处理 ...

  2. mysql 需要内核级线程的支持,而不只是用户级线程,这样才能够有效的使用多个cpu

    mysql 需要内核级线程的支持,而不只是用户级线程,这样才能够有效的使用多个cpu

  3. 【Linux】E297: Write error in swap file 解决办法

    今天登陆到服务器上,发现通过vi 打开文件就会报错: E297: Write error in swap file E303: Unable to open swap file for "c ...

  4. 【Oracle】转:通过案例学调优之--Oracle Time Model(时间模型)

    转自:http://blog.51cto.com/tiany/1596012 通过案例学调优之--Oracle Time Model(时间模型) 数据库时间 优化不仅仅是缩短等待时间.优化旨在缩短最终 ...

  5. linux命名小技巧(持续更新)

    一   向某个文件批量加入内容 1.1 向/etc/wxm文件添加一大段内容可以使用这个命令 [root@registry easyrsa3]# cat <<EOF >varsset ...

  6. JAVA之路_假克隆、浅克隆、深克隆

    一.JAVA假克隆 Java中,对于基本类型,可以用"="进行克隆,而对于引用类型却不能简单的使用"="进行克隆,这与JAVA的内存使用空间有关,JAVA在栈中 ...

  7. 使用axis1.4生成webservice的客户端代码

    webservice服务端: https://blog.csdn.net/ghsau/article/details/12714965 跟据WSDL文件地址生成客服端代码: 1.下载 axis1.4 ...

  8. 渗透测试中期--漏洞复现--MS08_067

    靶机:Win2k3    10.10.10.130 攻击机:BT5      10.10.10.128 一:nmap 查看WinK3是否开放端口3389 开放3389方法:我的电脑->属性-&g ...

  9. 干货!上古神器 sed 教程详解,小白也能看的懂

    目录: 介绍工作原理正则表达式基本语法数字定址和正则定址基本子命令实战练习 介绍 熟悉 Linux 的同学一定知道大名鼎鼎的 Linux 三剑客,它们是 grep.awk.sed,我们今天要聊的主角就 ...

  10. Numpy的一些学习记录

    Numpy的一些记录 产生numpy.array的方式 import numpy as np arr1 = np.array([1, 2, 3]) print(arr1) arr2 = np.zero ...