zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    百马百担
    穷举
    折叠次数
    判断年份是否是闰年
    定义xy比大小
    1月21日
    1月20日作业-第三题
    1月20日作业-第二题
    1月18日
    1月18日
  • 原文地址:https://www.cnblogs.com/liulangye/p/2358124.html
Copyright © 2011-2022 走看看