2447: 吃饭
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 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;
}