该题在选择物品的时候,必须得选择盒子,因此为有依赖的背包,注意与树形dp的区别
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int dp[55][100005];
int main()
{
int n,v,i,j,k,pi,t,c,w;
while(scanf("%d%d",&n,&v)!=EOF)
{
memset(dp,0,sizeof(dp));
for (i=1;i<=n;++i)
{
scanf("%d%d",&pi,&t);
for (j=0;j<pi;++j)
dp[i][j]=-1;//表示该状态无法选择
for (j=v;j>=pi;--j)
dp[i][j]=dp[i-1][j-pi];//继承上一次的结果
for (k=1;k<=t;++k)
{
scanf("%d%d",&c,&w);
for (j=v;j>=c;--j)
if (dp[i][j-c]!=-1)//代表选了选该状态的情况下还要选盒子
{
dp[i][j]=max(dp[i][j],dp[i][j-c]+w);
}
}
for (j=v;j>=0;--j)//如果可以更新,那么就进行更新
dp[i][j]=max(dp[i][j],dp[i-1][j]);
}
printf ("%d\n",dp[n][v]);
}
return 0;
}