Zij een lijst van \(n\) objecten gegeven. Deze objecten hebben elk een bepaald volume. Men wenst deze objecten te vervoeren met vrachtwagens, maar wel zo dat er zo weinig mogelijk vrachtwagens worden gebruikt. Alle vrachtwagens hebben eenzelfde capaciteit. De objecten moeten dus op een slimme manier worden ingeladen in de vrachtwagens zodanig dat het aantal te gebruiken vrachtwagens zo laag mogelijk is.
Implementeer een gretig algoritme dat een reeks gegeven objecten verdeelt onder een zo klein mogelijk aantal vrachtwagens, waarbij het totale volume van de objecten in een vrachtwagen diens capaciteit niet mag overschrijden. Schrijf hiervoor de methode public List<Fleet.Truck> pack(List<Integer> items, Fleet fleet)
in een klasse MyTruckLoader
die de gegeven interface TruckLoader
1 implementeert. Deze methode neemt een lijst die de volumes van de items bevat en een object van het type Fleet
als input. Als output geeft deze methode een lijst met (zo weinig mogelijk) opgevulde vrachtwagens van het type Fleet.Truck
terug.
De interface Fleet
2 bevat één methode public Truck createTruck()
die een nieuw object van het type Truck
aanmaakt, een binneninterface van Fleet
. Indien je een nieuwe vrachtwagen wil aanmaken, doe je dit dus door fleet.createTruck()
op te roepen. Een vrachtwagen kent zijn eigen capaciteit en heeft volgende methoden:
public void add(int item)
: voegt een object toe aan de vrachtwagen. Indien de capaciteit hierdoor overschreden zou worden, wordt een OverloadException
opgegooid.public boolean canAdd(int item)
: geeft aan of een object nog in de vrachtwagen past.public int getRemainingCapacity()
: geeft de reseterende capaciteit van de vrachtwagen terug (steeds positief).public List<Integer> getItems()
: geeft een lijst terug met de objecten die in de vrachtwagen geplaatst zijn. Merk op dat je deze lijst niet rechtstreeks kan aanpassen. Hiervoor moet je de methode add
gebruiken.Opmerking: pas de inputlijst van de methode pack
niet aan. Indien je dit wel doet, zullen de testen falen.
Gebruik eventueel de testklasse SimpleTest
3 om je oplossing lokaal te testen. Je kan hierin eenvoudig extra testgevallen toevoegen. Dit kan je doen door de methode pack(items, () -> new TestTruck(capacity))
op te roepen. Hierbij is () -> new TestTruck(capacity)
een implementatie van de interface Fleet
, beknopt gedefinieerd aan de hand van een lambda-expressie.