题目描述
小明最近喜欢上了一款“消灭病毒”的游戏。游戏中有各种各样不同的病毒,消灭的病毒越多,得分越高。但是在游戏中,玩家一旦被病毒击中将减少一定的生命值。
在游戏中,玩家可以通过添加不同的药水来获取生命值。生命值越高,在游戏中存活的时间越长。
游戏一共提供了N种药水,第i种药水的体积为V(i),补充的生命值为L(i)。
玩家可以携带一个体积为V的药水瓶。每一种药水可以全部装入药水瓶,也可以只装入一部分。当然,如果你装入一部分药水,那么也只能补充这一部分药水按比例对应的生命值。
请问如何装入药水可以使得初始的生命值最大?请输出最大的初始生命值。
输入
单组输入。
第1行输入两个正整数V和N,分别表示药水瓶的体积和药水的种类数。(N<=100)
接下来N行,每行包含两个正整数,分别对应第i种药水的体积V(i)和生命值L(i)。
输出
输出最大的初始生命值(四舍五入保留两位小数)。
样例输入 Copy
10 3
5 6
3 3
4 2
样例输出 Copy
10.00
ps:这就是一个背包问题,具体请看如下代码
#include <iostream>
#include<algorithm>
using namespace std;
struct node {
double v, l, c;
}s[105];
int cmp(const node &a, const node& b) {
return a.c > b.c;
}
int main() {
int v, n; scanf("%d %d", &v, &n);
for (int i = 1; i <= n; i++) {
cin >> s[i].v >> s[i].l;
s[i].c = s[i].l / s[i].v;
}
sort(s + 1, s + 1 + n, cmp);//从大到小排序
double sum = 0;
for (int i = 1; i <= n; i++)
{
if (s[i].v <= v)
{
v -= s[i].v;
sum += s[i].l;
}
else {
sum += s[i].c * v;
break;
}
}
printf("%.2f\n", sum);
return 0;
}