#include #include #include class Item { private: std::string name; int weight; int price; public: int GetItemWeight() { return weight; } int GetItemPrice() { return price; } double GetPriceOfWeight() { return price / (double)weight; } void PrintParametres() { std::cout << "\tName item: " << name << "\n\t\tWeight: " << weight << "\n\t\tPrice:" << price << std::endl; } void SetParametresOfItem() { std::cout << "Enter name of item: "; std::cin >> name; std::cout << std::endl; std::cout << "Enter weight of item: "; std::cin >> weight; std::cout << std::endl; std::cout << "Enter price of item: "; std::cin >> price; std::cout << std::endl; } }; class ItemsHeap { private: bool sorted = false; std::vector itemsHeap; void m_swap(int i_1, int i_2) { Item tmp = itemsHeap[i_1]; itemsHeap[i_1] = itemsHeap[i_2]; itemsHeap[i_2] = tmp; } void sort_items() { int i_mx = 0; for (int i = 0; i < itemsHeap.size(); ++i) { i_mx = i; for (int j = i + 1; j < itemsHeap.size(); ++j) { if (itemsHeap[j].GetPriceOfWeight() > itemsHeap[i_mx].GetPriceOfWeight()) { i_mx = j; } } if (i != i_mx) m_swap(i, i_mx); } } public: int GetSizeHeap() { return itemsHeap.size(); } void AddItemInHeap() { Item newItem; newItem.SetParametresOfItem(); itemsHeap.push_back(newItem); } Item getItem() { if (!sorted) { sort_items(); sorted = true; } Item temp = itemsHeap[0]; itemsHeap.erase(itemsHeap.begin()); return temp; } }; class Knapsack { private: int max_weight; int weight = 0; int price = 0; ItemsHeap heap; std::vector items; void SumOfItems(Item temp) { price += temp.GetItemPrice(); } void WeightOfItems(Item temp) { weight += temp.GetItemWeight(); } public: int GetSizeOfHeapOnFloor() { return heap.GetSizeHeap(); } void SetMaxWeight() { std::cout << "Enter max weight: "; std::cin >> max_weight; std::cout << std::endl; } void PrintItems() { std::cout << "Items:\n"; for (int i = 0; i < items.size(); ++i) { items[i].PrintParametres(); } } void PrintParametresKnapsack() { std::cout << "Backpack parametres:\n" << "\tPrice: " << price << " " << "\n\tWeight: " << weight << " " << "\n\tMax weight: " << max_weight << std::endl; PrintItems(); } void AddItemOnFloor() { heap.AddItemInHeap(); } void AddItemInKnapsack() { while (heap.GetSizeHeap() > 0) { Item temp = heap.getItem(); if (temp.GetItemWeight() + weight <= max_weight) { items.push_back(temp); SumOfItems(temp); WeightOfItems(temp); } else break; } std::cout << "Complete task" << std::endl; } }; void main() { Knapsack backpack; backpack.SetMaxWeight(); backpack.AddItemOnFloor(); backpack.AddItemInKnapsack(); backpack.PrintParametresKnapsack(); }