以前不会做的题目,看完分组背包后突然就会做了。
#include<iostream>
using namespace std;
int dp[105][105];
int cost[105],value[105];
int maxi(int a,int b)
{
if(a>b)
return a;
else return b;
}
int main()
{
int n,t,i,j,m,s,k;
while(cin>>n>>t)
{
for(i=0;i<=t;i++)
dp[0][i]=0;
for(i=1;i<=n;i++)
{
cin>>m>>s;
for(j=1;j<=m;j++)
cin>>cost[j]>>value[j];
if(s==0)
{
for(k=0;k<=t;k++)
dp[i][k]=-10000000;
for(j=1;j<=m;j++)
for(k=t;k>=cost[j];k--)
{
dp[i][k]=maxi(dp[i][k],dp[i][k-cost[j]]+value[j]);
dp[i][k]=maxi(dp[i][k],dp[i-1][k-cost[j]]+value[j]);
}
}
if(s==1)
{
for(k=0;k<=t;k++)
dp[i][k]=dp[i-1][k];
for(j=1;j<=m;j++)
for(k=t;k>=cost[j];k--)
dp[i][k]=maxi(dp[i][k],dp[i-1][k-cost[j]]+value[j]);
}
if(s==2)
{
for(k=0;k<=t;k++)
dp[i][k]=dp[i-1][k];
for(j=1;j<=m;j++)
for(k=t;k>=cost[j];k--)
{
dp[i][k]=maxi(dp[i][k],dp[i][k-cost[j]]+value[j]);
dp[i][k]=maxi(dp[i][k],dp[i-1][k-cost[j]]+value[j]);
}
}
}
dp[n][t]=maxi(dp[n][t],-1);
cout<<dp[n][t]<<endl;
}
return 0;
}