题目大意:
给你一些物品,每个物品有自己的花费和价值,每个物品 都有相对应的箱子, 如果你想要买这个物品,你就需要先买这个箱子(依赖),求 n个箱子花费 t 能获得的最大价值
思路:
dp[i][j] 代表在 i 个箱子花费 j 能获得的最大价值
我们需要优先对箱子进行处理,处理完之后其他的都和 01背包一样了
具体的看代码注释吧
int dp[55][100010]; int n,t,box,num; int main () { int i,j,k; while(scanf("%d %d",&n,&t)!=EOF) { memset(dp,0,sizeof(dp));//初始化背包 for(i=1;i<=n;i++) { scanf("%d %d",&box,&num); for (int j=0; j<=box;j++) //对盒子的处理(即依赖) dp[i][j] = -1; for(k=t;k>=box;k--) dp[i][k]=dp[i-1][k-box]; //先让每组数据拿到上组的状态 //下列操作先算出我需要该组物品(盒子) for(j=0;j<num;j++) { int c,w; scanf("%d %d",&c,&w); for(k=t;k>=c;k--) { 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]); } } printf("%d\n",dp[n][t]); } return 0; }
原文地址:https://www.cnblogs.com/-Ackerman/p/12264623.html
时间: 2024-11-12 17:54:35