编辑代码

#include <iostream>
#include <algorithm>
#include <list>
#include <vector>

using namespace std;

// 待装的物品
struct Item {
        string name;
        double totalWeight;
        double totalValue;

        Item(string itemName, double weight, double value) {
            name = itemName;
            totalWeight = weight;
            totalValue = value;
        }
};

// 装进包的物品
struct PackedItem {
    string name;
    double packedWeight;

    PackedItem(string itemName, double weight) {
        name = itemName;
        packedWeight = weight;
    }
};

void printPackedItems(std::list<PackedItem> *packedItems) {
    for (std::list<PackedItem>::iterator i = packedItems->begin(); i != packedItems->end(); ++i)
    {
        cout << i->name << ":" << i->packedWeight << endl;
    }
    
}

void printItems(std::vector<Item> *items) {
    // for (std::vector<Item>::iterator i = items->begin(); i != items->end(); ++i)
    // {
    //     cout << i->name << ":" << i->totalWeight << endl;
    // }
    //cout << "-----------------------";
    
}

// 返回真,left和right位置不变
// 返回假,left和right要交换位置

// 升序排列:返回left < right
// 降序排列:返回left > right
bool compareGreaterItemUnitPrice(Item left, Item right) {
    //cout << "left " << left.name << ": "<< left.totalValue/left.totalWeight << " right " << right.name << ": "<< right.totalValue/right.totalWeight << endl;
    return (left.totalValue/left.totalWeight) > (right.totalValue/right.totalWeight);
}


void packItem(float packageWeight, std::vector<Item> *items, std::list<PackedItem> *packedItems) {
    //按照单价从大到小顺序对待装包的物品进行排序
    sort(items->begin(), items->end(), compareGreaterItemUnitPrice);

    printItems(items);

    float curWeight = 0.0; // 记录当前装进包包的物品的重量
    //将豆子装入背包
    for(std::vector<Item>::iterator i = items->begin(); i != items->end(); ++i) {
        // 满不满足限制值
        if (curWeight + i->totalWeight < packageWeight) {
            // 装包
            packedItems->push_back(PackedItem(i->name, i->totalWeight));
            // 记录一下装进包包物品的重量
            curWeight += i->totalWeight;
        }
        else {
            // 只能装一部分进去,计算还可以装多少,计算包的总重量减轻已经装的重量
            packedItems->push_back(PackedItem(i->name, packageWeight - curWeight));
            break;
        }

    }
}

int main(){
    std:vector<Item> items;

    //初始化装包豆子
    items.push_back(Item("黄豆", 100, 100));
    items.push_back(Item("绿豆", 30, 90));
    items.push_back(Item("红豆", 60, 120));
    items.push_back(Item("黑豆", 20, 80));
    items.push_back(Item("青豆", 50, 75));
   
    std::list<PackedItem> packedItems;

    packItem(100, &items, &packedItems);

    printPackedItems(&packedItems);


}