hdu 3033 i love sneakers

这个题目就是说,现在这个小孩去买鞋,然后一共有n种不同的原则,b种品牌,当然每个品牌都有一个价格(当心价格可能是0),小孩还给每个鞋子一个价值。现在小孩拿着m元钱去买鞋,要求每种品牌的鞋子都至少要买一双,问他能获得的最大价值是多少。这个题目是分组背包,但是注意和背包九讲的区别,背包九讲里的那个是每种鞋子最多购买一种。注意循环的时候的顺序。注释的语句很容易的帮你查找对错。

#include<iostream>
#include<cstring>
using namespace std;
int dp[11][10005];
int num[11];
int cost[11][100];
int value[11][100];
int maxi(int a,int b)
{
	if(a>b)
		return a;
	return b;
}
int main()
{
	int n,m,i,j,k,b,x,a,c,ans;
	while(cin>>n>>m>>b)
	{
		for(i=1;i<=b;i++)
			num[i]=0;
		ans=0;
		for(i=1;i<=n;i++)
		{
			cin>>x>>a>>c;
			num[x]=num[x]+1;
			cost[x][num[x]]=a;
			value[x][num[x]]=c;
		}
		for(i=1;i<=b;i++)
			for(j=0;j<=m;j++)
				dp[i][j]=-1;
		for(i=0;i<=m;i++)
			dp[0][0]=0;
		for(i=1;i<=b;i++)
		{
			for(j=1;j<=num[i];j++)
				for(k=m;k>=cost[i][j];k--)
				{
					if(dp[i][k-cost[i][j]]!=-1)
						dp[i][k]=maxi(dp[i][k],dp[i][k-cost[i][j]]+value[i][j]);
					if(dp[i-1][k-cost[i][j]]!=-1)
						dp[i][k]=maxi(dp[i][k],dp[i-1][k-cost[i][j]]+value[i][j]);
				}
			/*cout<<dp[i][m]<<endl;*/
		}
		if(dp[b][m]==-1)
			cout<<"Impossible"<<endl;
		else cout<<dp[b][m]+ans<<endl;
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值