HDU 3008 Warcraft (DP 背包)

来源:互联网 发布:角度尺软件 编辑:程序博客网 时间:2024/05/23 18:33

题目开始时,丝毫没有想法,其实,变量多可以找到其中重要的状态,可以找到其 状态转移方程

dp[i][j] --------- i表示, 第i秒, j表示 此时hero的魔法值 ,其值表示,当前的量可以对monster造成的最大伤害

可以近似看成完全背包问题

dp[i][j]= max( dp[i][j], dp[i-1][j-a[k]]+b[k] )

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#define PI acos(-1.0)#define max(a,b) (a)>(b)? (a):(b)#define min(a,b) (a)>(b)? (b):(a)#define INT_MIN -0x7FFFFFFF#define INT_MAX 0x7FFFFFFFint n,t,q;int a[110],b[110];int dp[110][110];// time and mofaint main(){    // freopen("in.txt","r",stdin);    int i,j,k;    while(scanf("%d%d%d",&n,&t,&q),n|| t|| q)    {        for(i=1;i<=n;i++)            scanf("%d%d",&a[i],&b[i]);        a[0]=0;b[0]=1;        int ti;        int flag=0;        if(100%q) ti=100/q+1;        else ti=100/q;        memset(dp,0,sizeof(dp));        for(i=1;i<=ti;i++)//time        {            for(j=0;j<=100;j++)            {                int mo=j;                mo+=t;                if(mo>100) mo=100;                for(k=0;k<=n;k++)//技能数                {                    if(j+a[k]<=100)//不可能由超过100魔法的状态得来                    {                        dp[i][mo]=max(dp[i][mo],dp[i-1][j+a[k]]+b[k]);//状态转移方程,注意前后魔法值的对应                    }                }                if(dp[i][mo]>=100)                {                    flag=1;                    printf("%d\n",i);break;                }            }            if(flag) break;//不加这个语句 WA到死        }        if(!flag)        {            printf("My god\n");        }        //for(i=1;i<=100;i++) printf("%d``\n",dp[4][i]);    }    return 0;}


原创粉丝点击