The Priest

Source : 计算机学院第二届“光熙杯”程序设计大赛

Time limit : 3 sec Memory limit : 32 M

Submitted : 186, Accepted : 51

Recently bailey playes a role in the game “world of warcraft”.It is a priest. The priest has n skills to heal the friends. Each skill costs different mana and adds different HP to the friends. When fighting with enemies, bailey wants to spend the minimal mana keeping the friend alive(If the friend’s HP<=0,he will die).But he doesn’t know how much is enough.He asks you for help.Let us consider a simple condition:

The priest has infinite mana but can only heal the friends once after a hurt.

Input

The first line of the input file contains a single integer t , the number of test cases, followed by the input data for each test case.

Each test case countains 2 lines as follow:

n m1 h1 m2 h2……mn hn

HP k d1 d2……dk

n gives the number of skills. mi hi means that the ith skill will cost the priest mi mana and add hi HP to the friend.

HP gives the max HP the friend has and in the beginning it’s full. k gives the number of hurt. di means the ith hurt will cost the friend di HP.( 0 < n <= 5 , 0 < mi <= 100 , 0 < HP <= 1000, 0 < k <= 100)

Output

One line for each case. If after k hurts the friend can be alive, output the minimal mana the priest can spend keeping the friend alive.Otherwise output “Lose the friend.”

Sample Input

2

2 1 4 2 10

15 2 8 11

2 1 4 2 10

15 2 14 12

Sample Output

2

Lose the friend.

哎这道题目我wa了19次,因为一条件忽视了吧。多想想,状态转移方程还是比较容易想通的

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <stdio.h>
#include <math.h> using namespace std;
#define MAX 10000000
int dp[105][1005];
int v[10];
int w[10];
int a[105];
int tag[1005];
int hp;
int n,k;
int sum;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&v[i],&w[i]);
}
scanf("%d%d",&hp,&k);
bool live=true;
for(int i=1;i<=k;i++)
{
scanf("%d",&a[i]);
if(a[i]>hp)
live=false;
}
if(!live)
{
printf("Lose the friend.\n");
continue;
}
for(int i=0;i<=101;i++)
for(int j=0;j<=1001;j++)
dp[i][j]=MAX;
a[0]=0;
dp[0][hp]=0;
memset(tag,0,sizeof(tag));
for(int i=1;i<=k;i++)
{
memset(tag,0,sizeof(tag));
for(int j=1;j<=hp;j++)
{
if(j==hp)
{
for(int p=1;p<j;p++)
{
if(dp[i][p]==MAX)
continue;
if(tag[p]==1)
continue;
for(int q=1;q<=n;q++)
{
if(p+w[q]>=hp)
dp[i][hp]=min(dp[i][hp],dp[i][p]+v[q]);
}
} }
if(j+a[i]<=hp&&dp[i-1][j+a[i]]!=MAX)
dp[i][j]=min(dp[i][j],dp[i-1][j+a[i]]);
for(int q=1;q<=n;q++)
{
if(j>w[q]&&!tag[j-w[q]]&&dp[i][j]>dp[i][j-w[q]]+v[q])
{
dp[i][j]=dp[i][j-w[q]]+v[q];
tag[j]=1;
}
} } }
int ans=MAX;
for(int j=1;j<=hp;j++)
{
ans=min(ans,dp[k][j]);
}
if(ans==MAX)
printf("Lose the friend.\n");
else
printf("%d\n",ans);
}
return 0;
}

HOJ 2252 The Priest(动态规划)的更多相关文章

  1. HOJ 2133&POJ 2964 Tourist(动态规划)

    Tourist Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1503 Accepted: 617 Description A ...

  2. HOJ 2139 Spiderman's workout(动态规划)

    Spiderman's workout My Tags (Edit) Source : Nordic Collegiate Programming Contest 2003 Time limit : ...

  3. HOJ 13845 Atomic Computer有向无环图的动态规划

    考虑任意一个数字,任何一个都会有奇怪的..性质,就是一个可以保证不重复的方案——直接简单粗暴的最高位加数字..于是,如同上面的那个题:+1.-1.0 但是考虑到65536KB的标准内存限制,会得出一个 ...

  4. HOJ 2124 &POJ 2663Tri Tiling(动态规划)

    Tri Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9016 Accepted: 4684 Descriptio ...

  5. {POJ}{动态规划}{题目列表}

    动态规划与贪心相关: {HDU}{4739}{Zhuge Liang's Mines}{压缩DP} 题意:给定20个点坐标,求最多有多少个不相交(点也不相交)的正方形 思路:背包问题,求出所有的正方形 ...

  6. HOJ题目分类

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  7. [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总

    本文出自   http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner  打开 这个专题一共有25题,刷完 ...

  8. HOJ 1402 整数划分

    HOJ1402 整数划分 http://acm.hit.edu.cn/hoj/problem/view?id=1402 [题目描述] 整数划分是一个经典的问题.希望这道题会对你的组合数学的解题能力有所 ...

  9. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

随机推荐

  1. C# 过滤sql特殊字符方法集合

    1./// <summary>    /// 过滤不安全的字符串    /// </summary>    /// <param name="Str" ...

  2. 1077. Kuchiguse (20)【字符串处理】——PAT (Advanced Level) Practise

    题目信息 1077. Kuchiguse (20) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B The Japanese language is notorious f ...

  3. ASP.NET WebApi 路由配置【转】

    一.路由介绍 ASP.NET Web API路由是整个API的入口.我们访问某个资源就是通过路由映射找到对应资源的URL.通过URL来获取资源的. 对于ASP.NET Web API内部实现来讲,我们 ...

  4. JavaScript-事件冒泡简介及应用

    一.什么是事件冒泡 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事 ...

  5. hadoop中文官网

    http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html

  6. Linux安装php运行环境

    安装apache: yum install httpd httpd-devel  启动apache: /etc/init.d/httpd start 此时输入服务器的IP地址,应该看到apache的服 ...

  7. 【python】一次执行多个linux命令

    方法:多个命令之间用“;”进行连接即可:

  8. Python 数据类型:字符串

    一.字符串介绍 字符串是由单引号/双引号/三引号引起来的,由字母 .数字或符号等构成的一串字符 In [1]: name = "Tom" # 定义字符串 In [2]: type( ...

  9. Activity、Window和View三者间的关系有一定的见解

    一.简述如何将Activity展现在手机上 Tips: Activity本身是没办法处理显示什么控件(view)的,是通过PhoneWindow进行显示的 换句话说:activity就是在造Phone ...

  10. 我们复习.Net的这些日子里

    今天是我们复习前面学习的第三天,也是在今天我们结束了复习.之前上学时间感觉知识全是生僻的,在生活中很少用到,因此喜欢重复的记忆,而现在学习的知识全是现在乃至未来,将是每天我们使用的,所以就感觉没必要重 ...