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#获取电脑客户端IP地址及当前用户名

    在C#中获取一台电脑名,IP地址及当前用户名是非常简单,以下是我常用的几种方法: 1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息: ...

  2. e673. Getting Amount of Free Accelerated Image Memory

    Images in accelerated memory are much faster to draw on the screen. However, accelerated memory is t ...

  3. javascript -- addEventListener()和removeEventListener

    addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作.所有的DOM节点中都包含这两种方法,并且它们都接受3个参数:要处理的事件名.作为事件 ...

  4. bootstrap table使用指南

    Bootstrap table是国人开发的一款基于 Bootstrap 的 jQuery 表格插件,通过简单的设置,就可以拥有强大的单选.多选.排序.分页,以及编辑.导出.过滤(扩展)等等的功能. 目 ...

  5. php中获取网站访客来源的关键词方法

    php中获取网站访客来源的关键词方法,收集了 <?php class keyword{ public function getKeyword($referer){ if(strpos($refe ...

  6. unity3d中的DontDestroyOnLoad来回切换出现多个实例问题

    在用Unity3D开发游戏中,我们会经常创建多个场景,但是在场景过度的时候,通常场景中的对象会被删除.所以Unity3D给了我们一个不删除前一个 场景中的某一个对象或者脚本的API,那就是“DontD ...

  7. 数据结构 http://www.cnblogs.com/sun-haiyu/p/7704654.html

    数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树.算法的性能取决于树的形状,而树的形状取决于插入键的顺序.在最好的情况下,n个结点的树是完全平衡的,如下图“最好情况”所示,此时树 ...

  8. 调整swap分区大小-Linux下安装Oracle时报swap不够解决方法

    调整swap分区大小 方法一:如果磁盘有剩余的空间,用分区工具新建一个swap分区.并写到/etc/fstab里面.再 #swapon -a方法二:可以用一个文件做交换分区. su root cd / ...

  9. C#的字符串优化-String.Intern、IsInterned

    https://www.jianshu.com/p/af6eb8d3d4bf 首先看一段程序: using System; class Program { static void Main(strin ...

  10. haffman哈夫曼编码的实现

    <span style="font-size:18px;">/* 1.在一棵二叉树中,我们定义从A节点到B节点所经过的分支序列为从A节点到B节点的路径: 定义从A节点到 ...