hdu 2159 FATE

http://acm.hdu.edu.cn/showproblem.php?pid=2159

二维DP 并不是很难

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>

using namespace std;
struct node
{
    int a,b;
}mem[101];  //a表示经验值 b 表示所需忍耐度
int n,m,k,s;

int ans[101][101];//ans[i][j]表示用i个忍耐度最多杀j个怪所能拿到的最多经验
int dp(int i,int j)
{
    if(ans[i][j]!=-1)
    return ans[i][j];
    if(j==0||i==0)
    {
        ans[i][j]=0;
        return ans[i][j];
    }
    ans[i][j]=0;
    for(int l=1;l<=k;l++)
    {
        if(i-mem[l].b>=0)//只有忍耐度不为负的才能继续递归
       {
           ans[i][j]=max(ans[i][j],mem[l].a+dp(i-mem[l].b,j-1));
       }
    }
    return ans[i][j];
}
int main()
{
    int i,j;
    int log;
    while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
    {
        for(i=1;i<=k;i++)
        scanf("%d%d",&mem[i].a,&mem[i].b);

        memset(ans,-1,sizeof(ans));
        for(i=m;i>0;i--)  //这里很重要 避免漏掉一些满足条件的情况
        dp(i,s);
        log=0;
       for(i=1;i<=m;i++)
        {
           for(j=1;j<=s;j++)
           {
              if(ans[i][j]>=n)
              {
                  printf("%d\n",m-i);
                  log=1;
                  break;
              }
           }
           if(log)
           break;
        }
        if(!log)
        {
           printf("-1\n");
        }
    }
    return 0;
}

你可能感兴趣的:(HDU)