首页 > 代码库 > HDU 3008 DP

HDU 3008 DP

基础DP题

打BOSS  BOSS和自己都有100点血,玩家先手

每回合可以选择施放技能攻击(耗蓝,共n种)或者普通攻击(不耗蓝,伤害为1),BOSS每回合会攻击自己q点血,每回合自己会恢复t点法力

方程:  dp[i][j-a[k]+t]=Max(dp[i][j-a[k]+t],dp[i-1][j]+b[k]);  


#include "stdio.h"
#include "string.h"

int inf=0x3f3f3f3f;

int Max(int a,int b)
{
    if (a<b) return b;else return a;
}
int main()
{
    int i,n,m,t,q,j,k,ans;
    int dp[101][101],a[101],b[101];
    while (scanf("%d%d%d",&n,&t,&q)!=EOF)
    {
        if (n+t+q==0) break;

        for (i=1;i<=n;i++)
            scanf("%d%d",&a[i],&b[i]);
        a[0]=0; b[0]=1;
        m=100/q;
        if (100%q!=0) m++;

        memset(dp,-1,sizeof(dp));
        ans=-1;
        dp[0][100]=0;
        for (i=1;i<=m;i++)
        {
            for (j=0;j<=100;j++)
                if (dp[i-1][j]!=-1)
                {
                    for (k=0;k<=n;k++)
                    if (a[k]<=j)
                    {
                        dp[i][j-a[k]+t]=Max(dp[i][j-a[k]+t],dp[i-1][j]+b[k]);
                        if (dp[i][j-a[k]+t]>=100) {ans=i; break;}
                    }
                    if (ans!=-1) break;
                }
            if (ans!=-1) break;
        }
        if (ans==-1) printf("My god\n");
        else printf("%d\n",ans);
    }
    return 0;
}



HDU 3008 DP