L'algoritmo goloso non può essere d'aiuto in quel caso. E non poteva essere paragonato a problemi di zaino frazionari o 0-1. Il primo potrebbe essere risolto da un avido algoritmo in O (n) e il secondo è NP.
Il problema che hai potrebbe essere forzato brutalmente in O (2 ^ n). Ma potresti ottimizzarlo usando la programmazione dinamica.
1) Ordina gli intervalli in base all'ora di inizio.
2) Inizializza int [] cost = new int [jobs.length] con Integer.MIN_VALUE (o qualsiasi valore negativo);
3) Definire seguire la routine ricorsiva (qui è Java):
private int findCost(Job[] jobs, int k, int[] costs) {
if(k >= jobs.length) {
return 0;
}
if(costs[k] < 0) {
int x = findNextCompatibleJob(jobs, k);
int sumK = jobs[k].cost + findCost(jobs, x, costs);
int sumK1 = findCost(jobs, k + 1, costs);
costs[k] = Math.max(sumK, sumK1);
}
return costs[k];
}
private int findNextCompatibleJob(Job[] jobs, int k) {
int finish = jobs[k].finish;
for(int i = k + 1; i < jobs.length; i++) {
if(jobs[i].start > finish) {
return i;
}
}
return Integer.MAX_VALUE;
}
4) Inizia la ricorsione con k = 0;
Ho implementato solo la routine di ricorsione mentre altre parti sono banali. Ho considerato che qualsiasi costo è> = 0. Se ci possono essere lavori a costo negativo, dobbiamo aggiungere un controllo per quello e passare semplicemente quei lavori senza considerazione.