题目:

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

最新文章

  1. 【Codeforces 707B】Bakery 水题
  2. Solr入门之(5)配置文件schema.xml
  3. spring 两个 properties
  4. [Windows Azure] Querying Tables and Entities
  5. 使用SDWebImage 怎么获取指定请求对应的缓存图片呢?
  6. C#选择文件、选择文件夹、打开文件(或者文件夹)
  7. SQL70001: This statement is not recognized in this context.
  8. KEIL段协定
  9. java中byte数组与int类型的转换(两种方式)
  10. C语言--流程控制
  11. AutoPy首页、文档和下载 - 跨平台的Python GUI工具包 - 开源中国社区
  12. Android 应用程序窗口显示状态操作(requestWindowFeature()的应用)
  13. NOIP2011-普及组复赛-第二题-统计单词数
  14. 基于vue2.0的一个豆瓣电影App
  15. DCOS实践分享(4):如何基于DC/OS整合SMACK(Spark, Mesos, Akka, Cassandra, Kafka)
  16. layui选项卡同步问题
  17. Linux命令之ls
  18. springboot mail+Thymeleaf模板
  19. SpringMVC源码阅读:Controller中参数解析
  20. Antd前端开发采坑记录

热门文章

  1. 立完flag,你可能需要对flag进行量化
  2. ps -p 进程号
  3. leetcode 730. 统计不同回文子序列(区间dp,字符串)
  4. EF Core 6.0的新计划
  5. DOCKER 安装步骤-最靠谱的笔记
  6. [Usaco 2012 Feb]Nearby Cows
  7. Windows Server 2012 R2 英文版汉化安装中文语言包教程更改为中文版
  8. Shell 简单入门教程
  9. tarjan 复习笔记 割点与桥
  10. ctsc选课