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 TruckLoader1 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 Fleet2 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:

Opmerking: pas de inputlijst van de methode pack niet aan. Indien je dit wel doet, zullen de testen falen.

Gebruik eventueel de testklasse SimpleTest3 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.