135 lines
2.8 KiB
C++
Raw Normal View History

2024-03-26 23:51:09 +04:00
#include <string>
#include <iostream>
#include <vector>
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 <Item> 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 <Item> 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();
}