Je hebt \(n\) dozen \(d_0, \dotsc, d_{k−1}\). Doos \(d\) heeft (in cm) hoogte \(h_i\) en grondvlak \(l_i \times b_i\). Je kan doos \(d_i\) op doos \(d_j\) plaatsen als de dimensies van het grondvlak allebei kleiner zijn, waarbij je \(l\) en \(b\) natuurlijk kan verwisselen door de doos te draaien. Je kan dus een doos met \(l = 4\), \(b = 7\) op een doos met \(l = 8\), \(b = 5\) plaatsen, maar niet op een doos met \(l = 7\), \(b = 7\). De bedoeling is nu te berekenen hoe hoog de hoogste toren is die je met deze dozen kan bouwen. Geef een algoritme met dynamisch programmeren, maar dat betekent niet dat je niet misschien eerst de volgorde van de dozen mag wijzigen… Je mag er (indien nodig) ook vanuit gaan dat de dimensies van de dozen kleine getallen zijn.

Implementeer de interface DozenStapelen1 in een klasse genaamd DynamischDozenStapelen. Schrijf een methode public int stapel(Collection<Doos> dozen) die de hoogte berekent van de grootste stapel die je kan bouwen met de gegeven dozen, zoals beschreven in de klasse Doos2.

Gebruik de testklasse SimpleTest3 om je oplossing lokaal te testen. Je kan hierin eenvoudig extra testgevallen toevoegen.