#include<cstdio>
#include<cstring>
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MIN(x,y) ((x)>(y)?(y):(x))
int dp[120][120];
int w[120],v[120];
int main()
{
int n,col;
while(~scanf("%d%d",&n,&col))
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
int cnt,lo;
scanf("%d%d",&cnt,&lo);
for(int j=1;j<=cnt;j++)
scanf("%d%d",&w[j],&v[j]);
if(lo==0)
{
for(int j=0;j<=col;j++)
dp[i][j]=-1;
for(int j=1;j<=cnt;j++)
{
for(int k=col;k>=w[j];k--)
{
if(dp[i][k-w[j]]!=-1)
dp[i][k]=MAX(dp[i][k],dp[i][k-w[j]]+v[j]);
if(dp[i-1][k-w[j]]!=-1)
dp[i][k]=MAX(dp[i][k],dp[i-1][k-w[j]]+v[j]);
}
}
}
else
{
if(lo==1)
{
for(int j=0;j<=col;j++)
dp[i][j]=dp[i-1][j];
for(int j=1;j<=cnt;j++)
{
for(int k=col;k>=w[j];k--)
{
if(dp[i-1][k-w[j]]!=-1)
dp[i][k]=MAX(dp[i][k],dp[i-1][k-w[j]]+v[j]);
}
}
}
else
{
for(int j=0;j<=col;j++)
dp[i][j]=dp[i-1][j];
for(int j=1;j<=cnt;j++)
{
for(int k=col;k>=w[j];k--)
{
if(dp[i][k-w[j]]!=-1)
dp[i][k]=MAX(dp[i][k],dp[i][k-w[j]]+v[j]);
}
}
}
}
}
int res=-1;
for(int i=0;i<=col;i++)
res=MAX(res,dp[n][i]);
if(res<0)
printf("-1\n");
else
printf("%d\n",res);
}
}
hdu 3535 混合背包(一组中最少取一个,最多取一个,可以任意取)
最新推荐文章于 2020-03-25 11:05:03 发布