#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
class GreedyItem {
public:
string name;
double totalWeight;
double totalValue;
GreedyItem(string itemName, double weight, double value) {
name = itemName;
totalWeight = weight;
totalValue = value;
}
GreedyItem(const GreedyItem& item) {
name = item.name;
totalWeight = item.totalWeight;
totalValue = item.totalValue;
}
};
vector<GreedyItem> packBean(int packCapacity, vector<GreedyItem>& items) {
vector<GreedyItem> fruit;
sort(items.begin(), items.end(), [](const GreedyItem& left, const GreedyItem& right) {
double leftUnitPrice = left.totalValue / left.totalWeight;
double rightUnitPrice = right.totalValue / right.totalWeight;
if (leftUnitPrice > rightUnitPrice) {
return true;
}
else if (leftUnitPrice == rightUnitPrice) {
return false;
}
else {
return false;
}
});
double leftPackCapacity = static_cast<double>(packCapacity);
for (const GreedyItem& item : items) {
if (leftPackCapacity > item.totalWeight) {
leftPackCapacity -= item.totalWeight;
fruit.push_back(item);
}
else {
double unitPrice = item.totalValue / item.totalWeight;
double packWeight = leftPackCapacity;
double packValue = packWeight * unitPrice;
fruit.push_back(GreedyItem(item.name, packWeight, packValue));
leftPackCapacity = 0;
break;
}
}
return fruit;
}
void test() {
vector<GreedyItem> items = {
GreedyItem("苹果", 15, 300),
GreedyItem("香蕉", 18, 180),
GreedyItem("橘子", 10, 150),
GreedyItem("猕猴桃", 9, 270),
};
vector<GreedyItem> beans = packBean(20, items);
double maxValue = 0;
cout << "装了如下物品:" << endl;
for (const GreedyItem& bean : beans) {
maxValue += bean.totalValue;
cout << bean.name << " " << bean.totalWeight << endl;
}
cout << "总价值:" << maxValue << endl;
}
int main() {
test();
return 0;
}