1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| public static void main( String[] args ) {
// INPUT: valeurs et nombre de pieces disponibles
int[] values = new int[] { 200, 100, 50, 20, 10, 5, 2, 1 };
int[] dispos = new int[] { 0, 0, 10, 10, 0, 0, 0, 10 };
// INPUT: valeur a rendre
int entry = 80;
// resolution du problème
int[] solution = solve(values, dispos, entry);
if (solution != null) {
System.out.print(Arrays.toString(solution));
} else {
System.out.println("pas de solution");
}
}
public static int[] solve(int[] values, int[] dispos, int remainder) {
// sauvegarde de la meilleure solution
int bestscore = Integer.MAX_VALUE;
int[] bestsolution = null;
// recherche des solutions possibles
int[] solution = new int[values.length];
int index = 0, score = 0;
while (index >= 0) {
// glouton à partir de la position courante
// avec une sortie immediate si on depasse le meilleur score
while (index < values.length && score < bestscore) {
solution[index] = Math.min(remainder / values[index], dispos[index]);
remainder -= solution[index] * values[index];
score += solution[index];
index++;
}
index--;
// c'est une meilleure solution : on la conserve.
if (remainder == 0 && score < bestscore) {
bestscore = score;
bestsolution = Arrays.copyOf(solution, solution.length);
}
// **** backtrack *** //
// annulation de la derniere opération effectuée
score -= solution[index];
remainder += values[index] * solution[index];
solution[index] = 0;
// recherche de la derniere selection non nulle
while (index >= 0 && solution[index] == 0) {
index--;
}
if (index < 0) break;
// decrémente la selection
score--;
remainder += values[index];
solution[index]--;
// poursuit l'exploration a partir de la position suivante
index++;
}
return bestsolution;
} |
Partager