吃饭 背包问题

吃饭

题目描述

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

输入

共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;
}

 

posted on 2016-07-24 10:11  disppr  阅读(215)  评论(0编辑  收藏  举报