您的位置:首页 > 其它

HDOJ 3033 I love sneakers! (分组背包)

2013-04-30 18:12 239 查看
超级传送门

dp[i][j]表示对于第i组物品,在花费j价格时的最大价值,有三个子状态

dp[i][j]表示不取该物品

dp[i][j-w]+v 表示选择该物品,但不是第一次

dp[i-1][j-w]+v表示选择该物品,但是是第一次

dp[i][j]=max(dp[i][j],dp[i-1][j-w]+v,dp[i][j-w]+v);
/*HODJ3033
作者:陈佳润
2013-04-30*/
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
#define max(a,b) (a>b?a:b)

queue<int>QV[12];//存放一组内物品的价值
queue<int>QW[12];//存放一组内物品的代价

int dp[110][10005];
int m,n,k;

void GroupPack(int k){
int i;
while(!QW[k].empty()){//对于每一组内的物品
for(i=m;i>=QW[k].front();i--){//对于每一个物品空间
if(i>=QW[k].front()){//在三个状态中找出最优的
dp[k][i]=max(dp[k][i],dp[k][i-QW[k].front()]+QV[k].front());
dp[k][i]=max(dp[k][i],dp[k-1][i-QW[k].front()]+QV[k].front());
}
}
QW[k].pop();
QV[k].pop();
}
}

int main(){
int i,a,b,c,j;
while(cin>>n>>m>>k){
//初始化
for(i=1;i<=k;i++){
for(j=0;j<=m;j++)
dp[i][j]=-1;
}
for(i=0;i<=m;i++)
dp[0][i]=0;
//读取
for(i=1;i<=n;i++){
cin>>a>>b>>c;
QV[a].push(c);
QW[a].push(b);
}
for(i=1;i<=k;i++){//分组背包
GroupPack(i);
}
if(dp[k][m]<0)
cout<<"Impossible"<<endl;
else
cout<<dp[k][m]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: