Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Bolas en cajas: Se tienen MaxBolas bolas indistinguibles y MaxCajas cajas vacías y se quiere
saber de qué formas distintas se pueden distribuir las MaxBolas bolas en las MaxCajas cajas (ver
figura de ejemplo). Diseñar un programa que resuelva este problema indicando el método de
programación y las estructuras de datos usadas. Ejemplo con MaxBolas = 2, MaxCajas = 3.
proc Backtracking(E/S sol: vector; E k: natural)
var caja: natural
Desde caja 1 hasta MaxCajas Hacer
sol[caja] sol[caja]+1
si k=MaxBolas entonces Escribir(sol)
si no
si k<MaxBolas entonces
Backtracking(sol,k+1)
fsi
fsi
fdesde
fproc
La llamada inicial (del ejemplo) sería Backtracking([0, 0, 0], 1).
Soluciones repetidas:
El problema de la mochila: Se tienen N objetos no fraccionables, cada uno de los cuales cuenta con su peso y valor disponible en una serie de vectores
P[1..N], y V[1..N] La mochila tiene una capacidad máxima TopeMochila que impide que entren la totalidad de los objetos. Diseñar un algoritmo que
encuentre la selección de objetos que se meterán en la mochila para obtener el máximo beneficio.
proc Backtracking(E/S P,V,C: vector;
E/S sol,sol_opt: vector;
E obj_act: natural)
Si (obj_act > N) entonces
Si (PesoTotal(sol) ≤ TopeMochila) Y
(ValorTotal(sol) > ValorTotal(sol_opt)) entonces
sol_opt sol
fsi
si no
sol[obj_act] 0
Mochila(P,V,C,sol,sol_opt,obj_act+1)
sol[obj_act] 1
Mochila(P,V,C,sol,sol_opt,obj_act+1)
fsi
fproc
En general, si el problema se amplía para que de cada objeto se tenga disponible una cantidad C[1..N] la cantidad de casos que hay que evaluar se dispara.
Necesitamos guardar la solución actual que estamos construyendo y la mejor solución encontrada (tanto vector como beneficio) y la capacidad actual que queda
en la mochila para evitar hacer cálculos extra.