Een buis van lengte \(l\) mm moet in kleine stukken gesneden worden. Jammer genoeg zijn niet alle lengten nuttig, maar het is wel bekend welke lengtes \(l_1, \dotsc, l_k\) nuttig zijn. De lengtes \(l_i\) zijn kleiner dan \(l\), maar zij – en \(l\) – zijn allemaal gehele getallen. Natuurlijk eist ook elke doorsnede een beetje ruimte – dat is dus een deel van de buis dat verloren gaat. De vraag is of er een opdeling in stukken van nuttige lengte bestaat zodat de hele buis wordt gebruikt (stel dat elke doorsnede 1 mm breed is). Hierbij bedoelt opdeling dat elke snede twee nuttige stukken van elkaar scheidt – een snede op het einde van de buis geldt dus niet.

Ontwerp een recursief algoritme en een algoritme met dynamisch programmeren voor dit probleem. Implementeer hiervoor de interface BuisOpdeling1 in een klasse genaamd BuisOpdelingDynamisch. Voor het recursief algoritme schrijf je een methode public boolean recursief(int l, Collection<Integer> lengtes), en voor het dynamisch algoritme een methode public boolean dynamisch(int l, Collection<Integer> lengtes).

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