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行,为第二多的能量值。

    样例输入

    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 <bits/stdc++.h>
     
    using namespace std;
    int best = 0, moo = -1, n, m, o;
    int vi[101], wi[101], si[101];
    void slove(int i, int j, int w, int s){
        if(i >= n){
            if(s > best){
                moo = best;
                best = s;
            }else if(s > moo && best > s){
                moo = s;
            }
            return;
        }
        if(vi[i] + j <= m && wi[i] + w <= o){
            slove(i, vi[i] + j, wi[i] + w, s + si[i]);
        }
        slove(i+1, j, w, s);
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin >> n >> m >> o;
            for(int i = 0; i < n; i++){
                cin >> vi[i] >> wi[i] >> si[i];
            }
         slove(0, 0, 0, 0);
         cout << moo << endl;
         return 0;
    }
  • 相关阅读:
    Twitter OA prepare: Rational Sum
    Java: Best Way to read a file
    Summary: gcd最大公约数、lcm最小公倍数算法
    Twitter OA prepare: Flipping a bit
    Twitter OA prepare: Equilibrium index of an array
    echo -e 参数
    openwrt 添加luci选项
    基于TLS的EAP 认证方法
    linux命令 dirname
    freeradius 错误: error:140890C7:SSL routines:ssl3_get_client_certificate:peer did not return a certificate
  • 原文地址:https://www.cnblogs.com/cshg/p/5700178.html
Copyright © 2011-2022 走看看