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