Consumer
题意:FJ要去购物,买的商品要用箱子装起来,每个箱子装不同的商品,问FJ能获得的最大价值;
只有先买了箱子,才能买固定的物品,所以这是个有依赖的背包问题,对于每个箱子内的物品一定是按01背包看是否要买;
对于每个箱子有两个状态,买,不买;买了就必定买了对应商品,那么买了这一箱子后,用剩下的钱买商品;
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int dp[maxn], temp[maxn];
int main(){
int n, w;
while(~scanf("%d%d", &n, &w)){
//printf("n: %d w: %d\n", n, w);
memset(dp, 0, sizeof(dp));
for(int i=1; i<=n; i++){
memcpy(temp, dp, sizeof(dp));
int p, m;
scanf("%d%d", &p, &m);
//printf("p: %d m: %d\n", p, m);
for(int k=1; k<=m; k++){
int c, v;
scanf("%d%d", &c, &v);
//printf("c:%d v:%d\n", c, v);
for(int j=w-p; j>=c; j--){
temp[j]=max(temp[j], temp[j-c]+v);
}
}
for(int j=p; j<=w; j++){
dp[j]=max(dp[j], temp[j-p]);
}
}
printf("%d\n", dp[w]);
}
return 0;
}