📅  最后修改于: 2023-12-03 14:58:35.610000             🧑  作者: Mango
该题目是一个经典的贪心算法问题,需要根据题目描述实现代码,并返回最优解。该问题可以通过贪心策略解决。
题目要求从一组物品中选择尽可能多的物品,使得这些物品的总重量不超过背包的容量。
使用贪心算法,思路如下:
排序:O(nlogn)
选择物品:O(n)
所以总时间复杂度为:O(nlogn)
由于使用了一个数组进行排序,所以空间复杂度为: O(n)
#include <iostream>
#include <algorithm>
using namespace std;
struct Object {
int weight, value;
double ratio; // used to sort objects
};
bool cmp(Object a, Object b) {
return a.ratio > b.ratio;
}
int main() {
int n, v;
cin >> n >> v;
Object *objects = new Object[n];
for (int i = 0; i < n; i++) {
cin >> objects[i].weight >> objects[i].value;
objects[i].ratio = (double)objects[i].value / objects[i].weight; // calculate the ratio
}
sort(objects, objects + n, cmp);
int ans = 0, c = 0;
for (int i = 0; i < n; i++) {
if (c + objects[i].weight <= v) {
c += objects[i].weight;
ans += objects[i].value;
}
else {
int r = v - c;
ans += (int)(r * objects[i].ratio);
break;
}
}
cout << ans << endl;
delete[] objects;
return 0;
}
该代码使用了结构体来存储物品信息,通过重载cmp函数实现了按照物品的价值重量比进行排序,然后使用贪心策略选择物品,最后输出选择物品的最大价值。
以上是本题题解,如有疑问,欢迎在评论区留言。