dp--upc2447

来源:互联网 发布:网络银商最重的判刑 编辑:程序博客网 时间:2024/04/30 15:10

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 0x3f3f3f3fusing 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;}


原创粉丝点击