编辑代码

#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;
}