周赛(三)_dp_01背包_1423: 贪婪戈尔曼

1423: 贪婪戈尔曼

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

题目描述

从前有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

来源


题目智能推荐

1313 2040 1650 2489 1359 1315 

#include<stdio.h>
#include<string.h>
 
#define N 1002
int a[N],b[N],c[N];
long long dp[52][52];
int n,s,h;
 
int main()
{
    int i,j,k,t1,t2;
    memset(dp,127,sizeof(dp));
    scanf("%d%d%d",&n,&s,&h);
    for(i=0;i<n;i++)
    scanf("%d%d%d",&a[i],&b[i],&c[i]);
    dp[0][0]=0;
    for(i=0;i<n;i++)
    {
        for(j=s;j>=0;j--)
        {
            for(k=h;k>=0;k--)
            {
                t1=j+a[i];
                t2=k+b[i];
                if(t1>s)//超过了也不改变目标值 
                t1=s;
                if(t2>h)
                t2=h;
                if(dp[t1][t2]>dp[j][k]+c[i])
                dp[t1][t2]=dp[j][k]+c[i];
            }
        }
    }
    printf("%lld\n",2*dp[s][h]);
    return 0;
}
 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭