EJERCICIOS DE ALGORÍTMICA Y COMPLEJIDAD VUELTA ATRÁS Ejercicio 1. Dado el conjunto siguiente de ítems: Objeto Peso Valor 1 10 100 2 7 63 3 8 56 4 4 12 Se decide utilizar el algoritmo de vuelta atrás de la mochila para obtener la solución óptima. Teniendo la mochila una restricción de peso de 16 kg. 1) Indicar cuantas soluciones existen 2) Indicar cuál es la solución óptima 3) Mostrar el árbol de decisiones que se construye durante la ejecución del algoritmo. El estado se mostrara por un tupla de 4 números que tomarán los valores 0, para indicar que el ítem no está incluido en la mochila, y 1 para indicar lo contrario. Ejercicio 2. Dado el algoritmo siguiente: C: array (1..MAX) of Integer range 0..1; procedure binario (m: Integer) is begin if m = 0 then Imprimir (C); else C(m) := 0; binario (m-1); C(m) := 1; binario (m-1); end if; end binario; 1) Comprobar que una llamada a “binario (3)” genera todas las posibles combinaciones de números binarios de 3 dígitos de longitud. 2) ¿En general, cuántas llamadas al procedimiento se realizan con “binario (n)”? 3) Deduce la complejidad del algoritmo. 4) Modifica el algoritmo para que únicamente se calculen los números binarios de longitud m que no contengan más de k dígitos a 1. Ejercicio 3. El siguiente algoritmo realiza una ordenación ascendente mediante la técnica de vuelta atrás. Para ello genera todas las permutaciones del vector de entrada. vec_entrada vec_ordenado : T_Vector := (2,1,3); : T_Vector; res : Boolean; --- Vector a ordenar -- inicialmente VACIO -- (vec_ordenado'length = 0) function backsort (ent: T_Vector; ord: T_Vector) return boolean is r : Boolean; begin if ent'length = 0 then --- No hay más números a ordenar if EstaOrdenado (ord) then Imprimir_Solucion (ord); return true; end if; end if; for i in ent'range loop r := backsort (remove (ent, i), add (ord, ent(i)) ); end loop; return false; end backsort; begin --- programa principal res := backsort (vec_entrada, vec_ordenado); end programa; Las funciones: • remove (vec, i). Devuelve un nuevo vector al que se ha eliminado el elemento de la posición i. La longitud del nuevo vector es una unidad inferior a la longitud del vector pasado como parámetro (vec). • add (vec, num). Devuelve un nuevo vector formado por el vector vec y el elemento num que ha sido añadido al final. • Imprimir_Solucion (vec). Imprime por pantalla el contenido de vec, comenzado por la posición vec’first. • EstaOrdenado (v). Devuelve el valor true si el vector v está ordenado de forma ascendente. Se pide: 1) Muestra el árbol que genera la función backsort, indicando en cada uno de los nodos los valores de los parámetros ent y ord. 2) ¿Cuántas posibles alternativas generaría backsort si la entrada fuera un vector de n elementos? 3) Modifica la función backsort, para que una vez encontrada la solución, no continúe con la búsqueda. 4) Elimina la llamada a la función EstaOrdenado e introduce código que permita comprobar si una alternativa es viable como solución. 5) Muestra todas las posibles alternativas que generará la función backsort con los cambios realizados en los apartados 3 y 4.