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  

 

posted @ 2012-09-01 21:39  诺小J  阅读(168)  评论(0编辑  收藏  举报