zoukankan      html  css  js  c++  java
  • hdu 2159 二维费用背包问题

    题意简单明确,打怪升级,现在需要n的经验就可以升最后一集,但是现在玩家有一定的忍耐限度m,因为打怪升级是在无聊,现在有k种怪兽,每种怪兽打败之后都能获得一定的经验值,现在告诉你打败该怪兽玩家能获得经验value1,以及打完该怪兽之后忍耐限度降低value2,现在要求你编写程序算出玩家能够升级并能保存的忍耐限度最大的值,输出最大值。

    其实就是一个二维费用的背包问题,研读背包九讲当中的第五讲就能知道,只不过是多开一个状态,那么就是

    Dp[i][j][k]在前i个物品下,花费j、k的代价最大能取到的价值,

    那么这个题目当中所表达的就是在前i个怪兽下,花费j的忍耐度打到k个怪兽所能获得的最高经验值。

    View Code
     1  #include<iostream>
     2  #include<stdio.h>
     3  using namespace std;
     4  int dp[110][110],value[110][2];
     5  int main()
     6  {
     7    int n,m,k,s;
     8    while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
     9    {
    10           for(int i=0;i<k;i++)
    11              scanf("%d%d",&value[i][0],&value[i][1]);
    12              memset(dp,0,sizeof(dp));
    13           int cost=0;
    14           for(int i=0;i<k;i++)
    15           {
    16               for(int v=value[i][1];v<=m;v++)
    17               {
    18                  for(int b=1;b<=s;b++)
    19                  {
    20                      dp[v][b]=dp[v][b]>dp[v-value[i][1]][b-1]+value[i][0]?dp[v][b]:dp[v-value[i][1]][b-1]+value[i][0];
    21                      if(dp[v][b]>=n&&m-v>=cost)
    22                      {
    23                         cost=m-v;
    24                      }
    25                  }        
    26               }        
    27           }
    28           if(dp[m][s]<n)printf("-1\n");
    29           else
    30           printf("%d\n",cost);
    31    }
    32    return 0;    
    33  }
    34  
    35  
  • 相关阅读:
    Python获取Linux的家目录
    Python 批量安装包、查看当前程序依赖的包
    获取linux目录下最新的文件
    Linux破解navicat
    Linux添加PATH
    Linux下文件分析 | 命令行
    ROP | 蒸米 -x86
    Jarvis OJ | guess
    杂项入门
    Whale ctf | misc
  • 原文地址:https://www.cnblogs.com/nuoyan2010/p/2667093.html
Copyright © 2011-2022 走看看