hdu(3449)(简单的有依赖背包)
该题在选择物品的时候,必须得选择盒子,因此为有依赖的背包,注意与树形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; }