吃饭
吃饭
题目描述
桐桐放学了,在学校食堂吃起了饭….
这里的饭十分好吃,但是桐桐的钱有限且肚子空间有限(^_^),虽然每种饭有无限多,但他只能吃部分,且每一种饭可增加一定的能量。桐桐觉得自己有点胖,于是下了一个决心:我今天只吃第二多能量值的饭!
请你输出他所吃的饭的能量值。
注意:第二多能量值的饭一定不等于最多能量值。
输入
共n+l行。
第1行三个数n,m,o,表示有n种食物供选择(每种食物可以选无限次),桐桐带了m元钱,肚子空间为o。
第2行到第n+l行,每行3个数ai,bi,ci,分别表示第i个食物需要花ai元钱,占用bi个肚子空间,而获得ci个能量值。
输出
1行,为第二多的能量值,如果你没有第二多,则输出“error”。
样例输入
10 7 3
4 1 133
1 2 420
4 1 98
5 3 762
7 3 91
5 1 746
2 2 910
4 1 655
2 2 271
5 3 286
样例输出
1565
提示
30%的数据满足:l≤n≤10 1≤m,o≤10;
50%的数据满足:l≤n≤100 l≤m,o≤100;
i00%的数据满足:1≤n≤100 1≤m,o≤1000。
分析:完全背包,注意先判断,再更新
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #include <ext/rope> #define rep(i,m,n) for(i=m;i<=n;i++) #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++) #define vi vector<int> #define pii pair<int,int> #define mod 1000000007 #define inf 0x3f3f3f3f #define pb push_back #define mp make_pair #define fi first #define se second #define ll long long #define pi acos(-1.0) const int maxn=1e3+10; const int dis[4][2]={{0,1},{-1,0},{0,-1},{1,0}}; using namespace std; using namespace __gnu_cxx; ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);} ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;} int n,m,o,dp[maxn][maxn],ma,mi; int main() { int i,j,k,t; ma=mi=-inf; memset(dp,-inf,sizeof(dp)); dp[0][0]=0; scanf("%d%d%d",&n,&m,&o); while(n--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); for(i=a;i<=m;i++) for(j=b;j<=o;j++) { if(dp[i-a][j-b]+c>ma) { mi=ma; ma=dp[i-a][j-b]+c; } else if(dp[i-a][j-b]+c>mi&&dp[i-a][j-b]+c<ma) mi=dp[i-a][j-b]+c; dp[i][j]=max(dp[i][j],dp[i-a][j-b]+c); } } if(mi>0)printf("%d\n",mi); else puts("error"); //system ("pause"); return 0; }