zoukankan      html  css  js  c++  java
  • 吃饭

    吃饭

    题目描述

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

    输入

    共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
    ",mi);
        else puts("error");
        //system ("pause");
        return 0;
    }
  • 相关阅读:
    ACM训练计划
    动态规划 最长公共子序列LCS
    Floyd最短路
    邻接表拓扑排序
    数字三角形(数塔) DP入门
    hdu 5533 计算几何 判断是否为正方形
    威尔逊定理--HDU2973
    二分--POJ-3258
    01背包--hdu2639
    矩阵快速幂--51nod-1242斐波那契数列的第N项
  • 原文地址:https://www.cnblogs.com/dyzll/p/5700616.html
Copyright © 2011-2022 走看看