dp--upc2447


2447: 吃饭

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 10  Solved: 4
[Submit][Status][Web Board]

Description

桐桐放学了,在学校食堂吃起了饭….
这里的饭十分好吃,但是桐桐的钱有限且肚子空间有限(^_^),虽然每种饭有无限多,但他只能吃部分,且每一种饭可增加一定的能量。桐桐觉得自己有点胖,于是下了一个决心:我今天只吃第二多能量值的饭!
请你输出他所吃的饭的能量值。
注意:第二多能量值的饭一定不等于最多能量值。

Input

共n+l行。
第1行三个数n,m,o,表示有n种食物供选择(每种食物可以选无限次),桐桐带了m元钱,肚子空间为o。
第2行到第n+l行,每行3个数ai,bi,ci,分别表示第i个食物需要花ai元钱,占用bi个肚子空间,而获得ci个能量值。

Output

1行,为第二多的能量值,如果你没有第二多,则输出“error”。

Sample Input

10 7 34 1 1331 2 4204 1 985 3 7627 3 915 1 7462 2 9104 1 6552 2 2715 3 286

Sample Output

1565

学习了一个技巧,如何记录第二大的值,这种背包问题怎么做有待加强
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int a[105],b[105],c[105],dp[1010][1010];
int main ()
{
    int N,M,O;
    while(scanf("%d%d%d",&N,&M,&O)!=EOF)
    {
        int i,j,k,m1=-INF,m2=-INF;
        memset(dp,-INF,sizeof(dp));
        dp[0][0]=0;
        for(i=0; i<N; i++)
            cin>>a[i]>>b[i]>>c[i];
        for(i=0; i<N; i++)
            for(j=a[i]; j<=M; j++)
                for(k=b[i]; k<=O; k++)
                {
                    if(dp[j-a[i]][k-b[i]]+c[i]>m1)
                    {
                        m2=m1;
                        m1=dp[j-a[i]][k-b[i]]+c[i];
                    }
                    else if(dp[j-a[i]][k-b[i]]+c[i]>m2&&dp[j-a[i]][k-b[i]]+c[i]<m1)
                        m2=dp[j-a[i]][k-b[i]]+c[i];
                    if(dp[j-a[i]][k-b[i]]+c[i]>dp[j][k])
                        dp[j][k]=dp[j-a[i]][k-b[i]]+c[i];
                }
        if(m2==-INF)
            cout<<"error"<<endl;
        else
            cout<<m2<<endl;
    }
    return 0;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值