1423: 贪婪戈尔曼
时间限制: 1 Sec 内存限制: 128 MB提交: 12 解决: 4
您该题的状态:已完成
[提交][状态][讨论版][Edit] [TestData]
题目描述
从前有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 101 2 52 4 103 7 81 11 366 0 18
样例输出
36
提示
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,g,h;
int a[1005],b[1005],c[1005];
long long f[51][51];
int main()
{
int i,j,k,t1,t2;
memset(f,127,sizeof(f));
scanf("%d%d%d",&n,&g,&h);
for(i=0;i<n;i++)
scanf("%d%d%d",&a[i],&b[i],&c[i]);
f[0][0]=0;
for(i=0;i<n;i++)
{
for(j=g;j>=0;j--)
{
for(k=h;k>=0;k--)
{
t1=j+a[i];
t2=k+b[i];
if(t1>g)//思维灵活,如果超过则仍算正好
t1=g;
if(t2>h)
t2=h;
f[t1][t2]=min(f[t1][t2],f[j][k]+c[i]);//核心代码
}
}
}
printf("%lld\n",2*f[g][h]); //注意饼干是每块多少钱,一次要买一对。
return 0;
}