You are on page 1of 1

SOLUCIÓN ÓPTIMA EJERCICIO PRÁCTICA

Ejercicio 3: la mochila
Dados n elementos, cada uno con un peso, indicar cuáles de estos elementos pueden llevarse en una mochila que tiene una capacidad de k kilos, de
manera de maximizar el número de kilos llevados en la mochila.

Ejemplo 1: Si los elementos son 7, 5, 6, 3, 8, 8, 4 y la mochila tiene una capacidad de 21 kilos, me llevaría los siguientes elementos:
5, 8, 8
Ejemplo 2: Si los elementos son 7, 5, 3, 9 y la mochila tiene una capacidad de 20 kilos, me llevaría los siguientes elementos:
7, 3, 9

Solución algorítmica:
Const Integer n = 30; // número de elementos (asumimos 30)
// tipos de datos
Type Record Mochila =
Integer kilos; // kilogramos que está cargando la mochila
Integer m; // número de elementos llevados en la mochila
Array x[1..n] of Integer; // elementos dentro de la mochila
EndRecord
// variables globales
Array elem[1..n] of Integer; // elementos a considerar
Integer capacidadMaxima; // capacidad máxima de la mochila
Mochila actual, mejor;

// Procedimiento principal
Procedure Main()
// se lee la capacidad máxima de la mochila (k)
Read(capacidadMaxima);
// se leen los elementos candidatos
For i=1 To n Do
Read(elem[i]);
EndFor
// inicialmente no hay nada en ninguna mochila
actual.m = 0;
actual.kilos = 0;
mejor.m = 0;
mejor.kilos = -1;
//se invoca al backtracking
Backtracking(1);
//se imprime la solución
Write(“Me llevo “, mejor.kilos, “kilos en la mochila”);
For i=1 To mejor.m Do
Write(mejor.x[i]);
EndFor
EndProcedure
G
Procedure Backtracking(paso) Procedure Backtracking(Integer paso)
InicializarAlternativa(alternativa); Integer alternativa;
Repeat // inicializar alternativa
ObtenerSiguienteAlternativa(alternativa); alternativa = paso-1;
If (AlternativaValida(alternativa)) Then Repeat
IncluirAlternativa(alternativa, solucionParcial); //selecciono la próxima alternativa
If EsSolucion(solucionParcial) then alternativa = alternativa+1;
If EsMejor(solucionParcial, solucionOptima) Then //chequeo si la alternativa es válida
solucionOptima = solucionParcial; If (actual.kilos + elem[alternativa] <= capacidadMaxima) then
EndIf //incluir alternativa
Else actual.kilos = actual.kilos+ elem[alternativa];
nuevoPaso = GenerarNuevoPaso(paso); actual.m = actual.m+1;
Backtracking(nuevoPaso); actual.x[actual.m] = elem[alternativa];
Paso = DeshacerPaso(nuevoPaso); //chequeo si la solución actual es mejor
EndIf If (actual.kilos > mejor.kilos) then
ExcluirAlternativa(alternativa, solucionParcial); mejor = actual;
EndIf EndIf
Until SeAcabaronLasAternativas(alternativa) or encontreSolucion==true; // llamada recursiva con el nuevo paso (paso+1)
EndProcedure Backtracking(paso+1);
//excluir alternativa tomada
actual.kilos = actual.kilos - elem[alternativa];
actual.m = actual.m - 1;
EndIf
Until (alternartiva==n); // hasta que se acaben las alternativas
EndProcedure

You might also like