135 lines
2.8 KiB
C++
135 lines
2.8 KiB
C++
|
#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();
|
||
|
}
|