HDU3535-AreYouBusy

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

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[110][110],c[110],g[110],n,T,i,j,k,m,s;
void case0()
{
    for(j=0;j<=T;j++)
       dp[i][j]=-1000000;
    for(j=1;j<=m;j++)
       for(k=T;k>=c[j];k--)
       {
              dp[i][k]=max(dp[i][k],dp[i][k-c[j]]+g[j]);
           dp[i][k]=max(dp[i][k],dp[i-1][k-c[j]]+g[j]);
       }
} 
void case1()
{
    for(j=0;j<=T;j++)
       dp[i][j]=dp[i-1][j];
    for(j=1;j<=m;j++)
       for(k=T;k>=c[j];k--)
          dp[i][k]=max(dp[i][k],dp[i-1][k-c[j]]+g[j]);
}
void case2()
{
    for(j=0;j<=T;j++)
       dp[i][j]=dp[i-1][j];
    for(j=1;j<=m;j++)
       for(k=T;k>=c[j];k--)
       {
              dp[i][k]=max(dp[i][k],dp[i][k-c[j]]+g[j]);
           dp[i][k]=max(dp[i][k],dp[i-1][k-c[j]]+g[j]);
       }
}
int main(void)
{
    while(scanf("%d%d",&n,&T)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&m,&s);
            for(j=1;j<=m;j++)
               scanf("%d%d",&c[j],&g[j]);
            if(s==0)      case0();
            else if(s==1) case1();
            else          case2();
           }   
        printf("%d\n",max(dp[n][T],-1));
    }
    return 0;
}
posted @ 2012-08-31 10:07  Yogurt Shen  阅读(226)  评论(0编辑  收藏  举报