题目概况
题目链接: https://www.luogu.com.cn/problem/P2240
难度: 普及/提高-
题目分析
简化题目: 题目简洁明了
涉及知识点: 贪心算法
解题思路:
不要被题目迷惑,这是一道实打实的贪心。
重点:所有金币都可以随意分割,那么我们考虑计算出每堆金币的单价,按照单价降序排列依次选择,这就是我们的贪心策略。
代码拆解与要点解析
代码简短,看注释。
完整代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <iomanip>
using namespace std;
struct node {
double m; //重量
double v; //价值
double dv; //单价
}a[105];
long double ans; //最后的总价值
int n, t;
bool cmp(node x, node y) {
return x.dv > y.dv;
}
int main() {
cin >> n >> t;
for (int i = 1; i <= n; i++) {
cin >> a[i].m >> a[i].v;
a[i].dv = 1.0 * a[i].v / a[i].m; //计算单价
}
sort(a + 1, a + n + 1, cmp); //按照性价比排序
for (int i = 1; i <= n; i++) {
if (a[i].m <= t) { //如果这堆的总重量小于剩余空间
ans += a[i].v; //总价值加上
t -= a[i].m; //剩余空间减
} else {
ans += a[i].dv * t; //把最后的空间装上
break; //装满了,break
}
}
cout << fixed << setprecision(2); //用这个就必须要iomanip的头文件
cout << ans << endl; //你当然也可以选择使用printf
return 0;
}

本文介绍了洛谷P2240部分背包问题的解题思路,通过简化题目,揭示其为贪心算法的应用。文章详细解析了解题过程,强调所有金币可任意分割,因此按金币单价降序选择是关键贪心策略。并提供了简洁的解题代码。
535

被折叠的 条评论
为什么被折叠?



