zoukankan      html  css  js  c++  java
  • HDU3236 Gift Hunting

     1 /*
     2  HDU3236 Gift Hunting
     3  http://acm.hdu.edu.cn/showproblem.php?pid=3236
     4  dp 滚动数组
     5  *
     6  *
     7  */
     8 #include <cstdio>
     9 #include <algorithm>
    10 using namespace std;
    11 const int Nmax=305;
    12 const int INF=1e9;
    13 int dp[2][505][55][2];
    14 int v1,v2,n,ans;
    15 
    16 struct A
    17 {
    18     int w;
    19     int v;
    20     int is;
    21 }a[Nmax];
    22 
    23 
    24 void init()
    25 {
    26     ans=-INF;
    27 }
    28 
    29 
    30 int work()
    31 {
    32     int t=0;
    33     for(int j=0;j<=v1;j++)
    34         for(int k=0;k<=v2;k++)
    35             dp[t][j][k][0]=dp[t][j][k][1]=dp[t^1][j][k][0]=dp[t^1][j][k][1]=-INF;
    36     dp[t^1][0][0][0]=0;
    37     for(int i=1;i<=n;i++)
    38     {
    39         for(int j=0;j<=v1;j++)
    40         {
    41             for(int k=0;k<=v2;k++)
    42             {
    43                 int v=a[i].v,w=a[i].w;
    44                 if(j-v>=0)
    45                 {
    46                     dp[t][j][k][0]=max(dp[t][j][k][0],dp[t^1][j-v][k][0]+w);
    47                     dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j-v][k][1]+w);
    48                 }
    49                 if(k-v>=0)
    50                 {
    51                     dp[t][j][k][0]=max(dp[t][j][k][0],dp[t^1][j][k-v][0]+w);
    52                     dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j][k-v][1]+w);
    53                 }
    54                 if(!a[i].is)
    55                 {
    56                     dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j][k][1]);
    57                     dp[t][j][k][0]=max(dp[t][j][k][0],dp[t^1][j][k][0]);
    58                     dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j][k][1]);
    59                     dp[t][j][k][0]=max(dp[t][j][k][0],dp[t^1][j][k][0]);
    60                 }
    61                 dp[t][j][k][1]=max(dp[t][j][k][1],dp[t^1][j][k][0]+w);
    62             }
    63         }
    64         t^=1;
    65         for(int j=0;j<=v1;j++)
    66             for(int k=0;k<=v2;k++)
    67                 dp[t][j][k][0]=dp[t][j][k][1]=-INF;
    68     }
    69     t^=1;
    70     for(int j=0;j<=v1;j++)
    71         for(int k=0;k<=v2;k++)
    72         {
    73             ans=max(ans,dp[t][j][k][0]);
    74             ans=max(ans,dp[t][j][k][1]);
    75         }
    76     return max(-1,ans);
    77 }
    78 
    79 
    80 int main()
    81 {
    82     //freopen("4.in","r",stdin);
    83     int cases=0;
    84     while(1)
    85     {
    86         cases++;
    87         scanf("%d%d%d",&v1,&v2,&n);
    88         if(!n && !v1 && !v2)
    89             break;
    90         for(int i=1;i<=n;i++)
    91             scanf("%d%d%d",&a[i].v,&a[i].w,&a[i].is);
    92         init();
    93         printf("Case %d: %d
    
    ",cases,work());
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    【WF2017】Mission Improbable
    【Codeforces 837D】Round Subset
    【Codeforces 788C】The Great Mixing
    【JSOI2008】最大数
    2.1图像的数字化
    MATLAB生成随机数
    四六级准考证号忘记了如何快速查询四六级成绩?
    加密与水印结合
    如何在 PyPI安装python的软件包?
    matlab中如何定义函数
  • 原文地址:https://www.cnblogs.com/BBBob/p/6610687.html
Copyright © 2011-2022 走看看