O algoritmo ganancioso não pode ajudar nesse caso. E não pôde ser comparado com problemas fracionários ou de mochila 0-1. O primeiro pode ser resolvido pelo algoritmo guloso em O (n) e o segundo é NP.
O problema que você tem pode ser forçado com força bruta em O (2 ^ n). Mas você pode otimizá-lo usando programação dinâmica.
1) Classifique os intervalos por hora de início.
2) Inicialize int [] costs = new int [jobs.length] com Integer.MIN_VALUE (ou qualquer valor negativo);
3) Defina a seguir a rotina recursiva (aqui é 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) Inicie a recursão com k = 0;
Eu implementei apenas rotina de recursão enquanto outras partes são triviais. Eu considerei que qualquer custo é> = 0. Se houver trabalhos com custos negativos, precisamos adicionar uma verificação e passar esses trabalhos sem consideração.
Sim, é equivalente a um problema de mochila. Considere o horário de término do trabalho e prepare a mesa como uma mochila. Antes de ler a solução a seguir, verifique o problema da mochila e sua solução.
Você também pode imprimir os trabalhos agendados percorrendo a tabela:
Complexidade é o mesmo que problema de mochila.
fonte