看来还是需要好好理解背包的含义啊!
本来鄙人写了3600+的代码,各种悲剧。果然还是对背包的理解不深啊!
看过人家的代码后才A出来.....
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int dp[111][111];
int max( int a,int b ){ return a>b?a:b; }
int max( int a,int b,int c ){ return a>max(b,c)?a:max(b,c); }
int main()
{
int G,T;
while( scanf("%d %d",&G,&T )!=EOF )
{
memset( dp,0,sizeof(dp) );
int i,j,k;
for( i=1;i<=G;i++ )
{
int N,type;
int w[111],v[111];
scanf( "%d %d",&N,&type );
for( j=1;j<=N;j++ )
scanf( "%d%d",&w[j],&v[j] );
if( type==0 )
{
for( j=0;j<=T;j++ )
dp[i][j]=INT_MIN;
for( j=1;j<=N;j++ )
for( k=T;k>=w[j];k-- )
dp[i][k]=max( dp[i][k],dp[i-1][k-w[j]]+v[j],dp[i][k-w[j]]+v[j] );
}
else if( type==1 )
{
for( j=0;j<=T;j++ )
dp[i][j]=dp[i-1][j];
for( j=1;j<=N;j++ )
for( k=T;k>=w[j];k-- )
dp[i][k]=max( dp[i][k],dp[i-1][k-w[j]]+v[j] );
}else if( type==2 )
{
for( j=0;j<=T;j++ )
dp[i][j]=dp[i-1][j];
for( j=1;j<=N;j++ )
for( k=T;k>=w[j];k-- )
dp[i][k]=max( dp[i][k],dp[i][k-w[j]]+v[j],dp[i-1][k-w[j]]+v[j] );
}
}
dp[G][T]=max( dp[G][T],-1 );
printf( "%d\n",dp[G][T] );
}
return 0;
}