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

超级传送门


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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值