Hallo,
ich habe erst diese Woche mit dem rekursiven Programmieren begonnen und verstehe es leider noch nicht ganz.
Mir wurde auf der Uni folgende aufgabe gestellt:
Gegeben sind Arbeitsaufträge unterschiedlicher Dauer. Die benötigte Anzahl von Stunden für
jeden Auftrag ist in einem int-Array hinterlegt. Schreiben Sie die public-Klasse ueb.Auftraege
mit einem parameterlosen Konstruktor und der Methode
public static int getMaxAnzahl(int[] auftragslaengen, int maxStunden),
die die maximale Anzahl der Aufträgen zurückliefert, die in maxStunden erledigt werden
können. (Die Aufträge, die erledigt werden, können beliebig aus den gegebenen Aufträgen
gewählt werden.)
ja ich weiß, iterativ ist dieses Beispiel schnell zu lösen allerdings brauch ich einen rekursiven Lösungsweg.
In der Vorlesung haben wir das Rucksackproblem durchgemacht weshalb ich diesn Ansatz genommen und ausgebaut habe:
Der Code funktioniert allerdings dauert diese Lösung beim Ausführen zu lange, habt ihr Vorschläge dieses Beispiel eleganter zu lösen?
LG
ich habe erst diese Woche mit dem rekursiven Programmieren begonnen und verstehe es leider noch nicht ganz.
Mir wurde auf der Uni folgende aufgabe gestellt:
Gegeben sind Arbeitsaufträge unterschiedlicher Dauer. Die benötigte Anzahl von Stunden für
jeden Auftrag ist in einem int-Array hinterlegt. Schreiben Sie die public-Klasse ueb.Auftraege
mit einem parameterlosen Konstruktor und der Methode
public static int getMaxAnzahl(int[] auftragslaengen, int maxStunden),
die die maximale Anzahl der Aufträgen zurückliefert, die in maxStunden erledigt werden
können. (Die Aufträge, die erledigt werden, können beliebig aus den gegebenen Aufträgen
gewählt werden.)
ja ich weiß, iterativ ist dieses Beispiel schnell zu lösen allerdings brauch ich einen rekursiven Lösungsweg.
In der Vorlesung haben wir das Rucksackproblem durchgemacht weshalb ich diesn Ansatz genommen und ausgebaut habe:
Code:
import java.util.*;
public class Auftraege
{
public Auftraege()
{
}
private static ArrayList<Integer> zeiten;
public static int getMaxAnzahl(int[] auftragslaengen, int maxStunden)
{
zeiten = new ArrayList<Integer>();
for(Integer a: auftragslaengen)
{
zeiten.add(a);
}
List<Integer> ziel = auswahl(0,zeiten,maxStunden);
return ziel.size();
}
public static List<Integer> auswahl(int k, ArrayList<Integer> zeiten, int restStd)
{
if(k >= zeiten.size())
{
return new ArrayList<>();
}
List<Integer> ohne =auswahl(k+1, zeiten, restStd);
Integer a = zeiten.get(k);
if(a <= restStd)
{
List<Integer> mit = auswahl(k+1, zeiten, restStd - a);
mit.add(a);
if(mit.size() > ohne.size())
{
return mit;
}
}
return ohne;
}
public static int max(List<Integer> x)
{
int summe = 0;
for(Integer a: x)
{
summe += a;
}
return summe;
}
Der Code funktioniert allerdings dauert diese Lösung beim Ausführen zu lange, habt ihr Vorschläge dieses Beispiel eleganter zu lösen?
LG