L'algorithme gourmand ne peut pas aider dans ce cas. Et cela ne pouvait pas être comparé à des problèmes fractionnels ou à 0-1. Le premier pourrait être résolu par un algorithme gourmand en O (n) et le second est NP.
Le problème que vous rencontrez pourrait être forcé par la force dans O (2 ^ n). Mais vous pouvez l'optimiser en utilisant une programmation dynamique.
1) Triez les intervalles par heure de début.
2) Initialiser int [] costs = new int [jobs.length] avec Integer.MIN_VALUE (ou toute valeur négative);
3) Définissez la routine récursive de suivi (voici 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) Commencez la récursivité avec k = 0;
J'ai implémenté uniquement une routine de récursivité alors que d'autres parties sont triviales. J'ai considéré que tout coût est> = 0. S'il peut y avoir des emplois à coût négatif, nous devons ajouter une vérification pour cela et simplement passer ces emplois sans considération.
Oui, cela équivaut à un problème de sac à dos. Tenez compte de l'heure de fin du travail et préparez la table comme un sac à dos. Avant de lire la solution suivante, veuillez vérifier le problème du sac à dos et sa solution.
Vous pouvez également imprimer les travaux planifiés en parcourant le tableau:
La complexité est la même que le problème du sac à dos.
la source