您的位置:首页 > 其它

hdu3449(有限制条件的01背包)

2016-06-09 12:59 344 查看
链接:点击打开链接

题意:有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
[w]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: