链接:点击打开链接
题意:有n种物品,和w块钱,买一种物品必须先买那一种物品的购物车,问最大所获得的价值
代码:
#include <vector>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
int p[105],dp[55][100005];
struct node{
int v,w;
};
vector<node> G[105];
int main(){
int n,m,i,j,k,x,y,w;
while(scanf("%d%d",&n,&w)!=EOF){
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
G[i].clear();
for(i=1;i<=n;i++){
scanf("%d",&p[i]);
scanf("%d",&m);
for(j=1;j<=m;j++){
scanf("%d%d",&x,&y);
G[i].push_back((node){x,y});
}
} //dp[i][j]表示前i个物品,容量是j获得的最大价值
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++){
for(j=0;j<p[i];j++)
dp[i][j]=-1;
for(j=p[i];j<=w;j++)
dp[i][j]=dp[i-1][j-p[i]]; //保证先买购物车
for(j=0;j<G[i].size();j++){ //直接在每个购物车内进行01背包
for(k=w;k>=G[i][j].v;k--)
if(dp[i][k-G[i][j].v]!=-1)
dp[i][k]=max(dp[i][k],dp[i][k-G[i][j].v]+G[i][j].w);
}
for(j=0;j<=w;j++) //和之前的值进行比较
dp[i][j]=max(dp[i][j],dp[i-1][j]);
}
printf("%d\n",dp[n][w]);
}
return 0;
}