Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Moch 2
Moch 2
if(c==0) return 0;
if(C<0) return -INFINITO;
if(c>=0 && n<0) return 0;
///////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////
//Mochila dinamica
///////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////
void mochilaDinamica(Array<int> peso, Array<int> valor, int n, int c){
Matriz<int> m(n,c+1);
int i, j;
for(i=0;i<n;i++) m[i][0]=0;
for(i=0;i<c+1;i++) m[0][i]=0;
i = n-1;
j = c;
//CASO BASE
if (items->EstaVacia()){
if(mejorValor < valor){
mejorValor = valor;
mejorSol = solActual->Clonar();
}
}else{
Puntero<Item> it = items->Primero();
items->BorrarPrimero();
for (int k = 0; k<=1 && it->ObtenerPeso()*k <= peso; k++){ // 0 o 1, va
a ser mi k en este caso.
if(k > 0)
solActual->Agregar(it);
mochilaBacktracking(items, peso - it->ObtenerPeso()*k, solActual,
mejorSol, valor + it->ObtenerValor()*k, mejorValor);
if(k > 0)
solActual->Borrar(it);
}
items->Agregar(it);
}
}
///////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////
//Mochila MEM
///////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////
Matriz<int> bdMochila(N,capacidad);
void inicializoMochila(){
for(int c=0;c<N;o++)
for(int c=0;c<capacidad;c++)
bdMochila[o][c]=NULL;
};
bool fueCalculadoMochila(int n,int c){
return bdMochila[n][c]!=NULL;
};
if(!fueCalculadoMochila(N,capacidad)){
if(capacidad==0)
bdMochila[N][capacidad] = 0;
else
bdMochila[N][capacidad] = maxDe3(valor[N]+ MochilaMem(capacidad-
peso[N],N-1,valor,peso),
MochilaMem(capacidad,N-1,valor,peso),
0);
};
return bdMochila[capacidad][N];
};
///////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////
//Mochila Dinamica con cantidad de elementos disponibles
///////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////
struct Prod{
nat valor;
nat cantidad;
Prod(){
valor = 0;
cantidad = 0;
}
}
}
}
//armar la solucion
Array<nat> res (n, 0); //voy a retornar, cuantos elementos voya tener de cada
tipo en la mochila.
nat i = n-1;
nat j = c;
return res;
}
///////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////
//Mochila Backtracking con cantidad de elementos disponibles
///////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////
void MochilaBacktrackingElementosRepetidosEx(Array<Item> items, nat c, nat it,
Array<nat>
cantActual, Array<nat> cantMejor
nat valorActual,
nat & mejorValor){
if (it == items.Largo){
if (valorActual > mejorValor){
mejorValor = valorActual;
Array<nat>::Copiar(cantActual, cantMejor);
}
}else{
for(nat k=0; k<=items[it].cantMax && k*items[it].peso <= c; k++){
cantActual[it] = k; //Agregar
MochilaBacktrackingElementosRepetidosEx(items, c -
k*items[it].peso, it + 1,
cantActual, cantMejor,
}
}