xynuoj 1423 贪婪戈尔曼(二维费用的背包问题)

1423: 贪婪戈尔曼

时间限制: 1 Sec  内存限制: 128 MB
提交: 26  解决: 16
您该题的状态:已完成
[提交][状态][讨论版]

题目描述

从前有2只狗,大的叫大狗,小的叫小狗,它们2个合起来就是狗儿们,使用英语的人把它们写作Girlman,传来传去,到最后大家决定叫它们格尔曼。它们 的叫声很特别,但是它们十分吝啬它们的叫声,你为了听到它们的叫声,决定买狗饼干送给它们吃,不同种类的饼干能让它们叫的次数不一样,同一块饼干对于大小 格尔曼的效果也不一样。它们很贪婪,如果你只给其中一只格尔曼吃狗饼干或者给两只格尔曼吃的不一样,有一只就会不高兴,因此你买狗饼干的时候总要两块两块 地买,而且现在每类饼干也只有2块(想要多的也没得)。现在不是流行节约型社会吗?因此你也不能浪费,你要求的是在满足你要听格尔曼叫声次数要求的情况 (两只格尔曼实际叫的次数都不小于你的要求即可)下的最小花费是多少。

输入

   输入文件的第一行为3个整数n、s、b,分别表示狗饼干的类数、你想听到的小格尔曼的叫声次数和大格尔曼的叫声次数,接下来有n行,第i+1行有3个整数si、bi、ci,分别表示第i类狗饼干能让小格尔曼叫的次数、能让大格尔曼叫的次数和该类饼干的单价。

1<=n<=1000、1<=s,b<=50、0<=si ,bi ,ci <=2147483647。

输出

输出文件只有一个整数,为满足你的要求情况下的最小花费。

样例输入

5 5 10
1 2 5
2 4 10
3 7 8
1 11 36
6 0 18

样例输出

36
二维费用的背包问题—01背包,一类饼干最多买两块,但是一买必须买俩,所以是01背包,只不过以前的限制关系都是让在一个最大范围内(给出上限),这次却可以超过上限,只要费用小就可以,这里需要操作一下,超过上线的都让其等于上限,选最小费用的。
#include
#include
#include
using namespace std;
int si[1005];
int bi[1005];
int c[1005];
long long dp[55][55];
int main()
{
	int n,s,b;
	memset(dp,127,sizeof(dp)); 
	scanf("%d%d%d",&n,&s,&b);
	for(int i=1;i<=n;i++)
		scanf("%d%d%d",&si[i],&bi[i],&c[i]);
	dp[0][0]=0;
	for(int i=1;i<=n;i++)
		for(int j=s;j>=0;j--)//注意底线是>=0 
			for(int k=b;k>=0;k--)
			{//题目中可以超过s,b,这里超过的也当s,b,只选代价小的 
				int x=min(s,j+si[i]);
				int y=min(b,k+bi[i]);
				if(dp[x][y]>dp[j][k]+c[i])
				dp[x][y]=dp[j][k]+c[i]; 
			}
	printf("%lld\n",dp[s][b]*2);//一次买俩,费用*2 
	return 0;
}


你可能感兴趣的:(动态规划)