先默认把所有的主件都买上,之后01附件的。最后比较不买主件的额即可
#include<stdio.h>
#include<string.h>int dp[11000][11000];//前i个箱子花费j元所得的价值
int n,t,box,num;
int main ()
{
while(cin>>n>>t)
{
memset(dp,-1,sizeof(dp)); //有依赖关系,要赋初值-1
memset(dp[0],0,sizeof(dp[0]));
for(i=1;i<=n;i++)
{
cin>>box>>num;
for(k=box;k<=t;k++) //我要买这个箱子,先把这个箱子给买了
dp[i][k]=dp[i-1][k-box];
for(j=0;j<num;j++) //之后对于当前箱子
int c,w;
cin>>c>>w;
for(k=t;k>=c;k--) //01
{
if(dp[i][k-c]!=-1) //买了箱子
dp[i][k]=max(dp[i][k],dp[i][k-c]+w);
}
}
for(j=0;j<=t;j++)
{ // 之前都是算作买箱子,这次是不买箱子
dp[i][j]=max(dp[i-1][j],dp[i][j]);
}
}
cout<<dp[n][t]<<endl;
}
return 0;
}