Требуется написать программу решающую задачу о рюкзаке

Требуется написать программу решающую задачу о рюкзаке методом жадных алгоритмов. Создайте класс предмета с полями цены и веса и названия предмета. Создайте класс рюкзака в котором хранилище предметом будет реализовано как любая подходящая структура данных типа "Предмет" . Создайте 5-6 предметов с различными параметрами. Создайте методы реализующие разные стратегии подготовки исходных данных(различные варианты сортировки). Добавьте методы добавления нового предмета в рюкзак разными стратегиями. Поэкспериментируйте с разными стратегиями и разными наборами предметов, чтобы ответить на вопрос - какой жадный подход даёт наилучший результат в большинстве сценариев.
Дополнительные параметры: codeFlowType: codeWrite codeFlowLang: Java
Создано: 11.06.2023 10:28

Требуется написать программу решающую задачу о рюкзаке методом жадных алгоритмов. Создайте класс предмета с полями цены и веса и названия предмета. Создайте класс рюкзака в котором хранилище предметом будет реализовано как любая подходящая структура данных типа "Предмет" . Создайте 5-6 предметов с различными параметрами. Создайте методы реализующие разные стратегии подготовки исходных данных(различные варианты сортировки). Добавьте методы добавления нового предмета в рюкзак разными стратегиями. Поэкспериментируйте с разными стратегиями и разными наборами предметов, чтобы ответить на вопрос - какой жадный подход даёт наилучший результат в большинстве сценариев.

/**
* Создаем класс предмета со свойствами: название, цена, вес
*/
public class Item {
    private String name;
    private int price;
    private int weight;

    public Item(String name, int price, int weight) {
        this.name = name;
        this.price = price;
        this.weight = weight;
    }

    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }

    public int getWeight() {
        return weight;
    }
}

/**
* Создаем класс рюкзака 
*/
public class Backpack {
    private List<Item> itemList;
    private int maxWeight;

    public Backpack(int maxWeight) {
        itemList = new ArrayList<>();
        this.maxWeight = maxWeight;
    }

    /**
    * Кладем предмет в рюкзак
    */
    public void putItem(Item item) {
        if (item.getWeight() <= maxWeight) {
            itemList.add(item);
            maxWeight -= item.getWeight();
        }
    }

    /**
    * Реализуем жадный алгоритм по максимизации стоимости
    */
    public void greedyMaxProfitStrategy(List<Item> items) {
        items.sort((o1, o2) -> Double.compare(o2.getPrice() / (double) o2.getWeight(), o1.getPrice() / (double) o1.getWeight()));

        for (Item item : items) {
            putItem(item);
        }
    }

    /**
    * Реализуем жадный алгоритм по минимизации веса
    */
    public void greedyMinWeightStrategy(List<Item> items) {
        items.sort(Comparator.comparing(Item::getWeight));

        for (Item item : items) {
            putItem(item);
        }
    }

    /**
    * Добавляем предмет в рюкзак, без применения жадных алгоритмов
    */
    public void addItem(Item item) {
        itemList.add(item);
    }

    public List<Item> getItemList() {
        return itemList;
    }
}

public class Main {
    public static void main(String[] args) {
        Item item1 = new Item("Item 1", 10, 5);
        Item item2 = new Item("Item 2", 50, 30);
        Item item3 = new Item("Item 3", 20, 10);
        Item item4 = new Item("Item 4", 30, 15);
        Item item5 = new Item("Item 5", 40, 20);

        Backpack backpack = new Backpack(40);

        // Используем различные стратегии для добавления предметов в рюкзак
        backpack.greedyMaxProfitStrategy(Arrays.asList(item1, item2, item3, item4, item5));
        System.out.println(backpack.getItemList());

        backpack = new Backpack(40);

        backpack.greedyMinWeightStrategy(Arrays.asList(item1, item2, item3, item4, item5));
        System.out.println(backpack.getItemList());

        backpack = new Backpack(40);

        backpack.addItem(item1);
        backpack.addItem(item2);
        backpack.addItem(item3);
        backpack.addItem(item4);
        backpack.addItem(item5);
        System.out.println(backpack.getItemList());
    }
}