package fr.univamu.progav.td2; import java.util.ArrayList; import java.util.List; public class BackPackSolver { private final List<Item> allItems; private final List<Item> currentBackpack = new ArrayList<>(); private final int availableVolume; public BackPackSolver(List<Item> allItems, int availableVolume) { this.allItems = allItems; this.availableVolume = availableVolume; } public List<Item> findBestValueBackpack(int nextItemIndex) { if (nextItemIndex >= allItems.size()) { return new ArrayList<>(currentBackpack); } List<Item> backpack1 = findBestValueBackpack(nextItemIndex+1); int currentVolume = sumVolumes(currentBackpack); if (currentVolume + allItems.get(nextItemIndex).volume > availableVolume) { return backpack1; } currentBackpack.add(allItems.get(nextItemIndex)); List<Item> backpack2 = findBestValueBackpack(nextItemIndex+1); return selectBestBackpack(backpack1, backpack2); } private List<Item> selectBestBackpack(List<Item> backpack1, List<Item> backpack2) { int value1 = sumValues(backpack1); int value2 = sumValues(backpack2); return (value1 >= value2)? backpack1 : backpack2; } public record Item(String name,int volume, int value) { @Override public String toString() { return name + " (Volume=" + volume + ", value=" + value + ")"; } } private static int sumValues(List<Item> backpack1) { return backpack1.stream().mapToInt(Item::value).sum(); } private int sumVolumes(List<Item> backpack) { return backpack.stream().mapToInt(Item::volume).sum(); } }