Sie sind auf Seite 1von 6

Algoritmo de la mochila 0/1 con

Programacin Dinmica

La programacin dinmica nos ayuda a optimizar los problemas sin verificar todos los casos
posibles, pues van a aquellos que mejor lo resuelven, para el algoritmo de la mochila lo que
queremos es llenarla con objetos que sea muy valiosos y de menor peso.
ejemplo: ingreso n: cantidad de objetos y Cap: capacidad mxima de la mochila
n=3 , Cap= 15
(b1,b2,b3)=(38,40,24)//valores de los objetos
(p1,p2,p3)=(9,6,5)//pesos de los objetos

PSEUDOCDIGO
algoritmo mochila(ent p,b:vect[1..n]de nat;
ent Cap:nat;
sal g:vect[0..n,0..Cap]de nat)
variables c,j:nat
principio
para c:=0 hasta Cap hacer g[0,c]:=0 fpara;
para j:=1 hasta n hacer g[j,0]:=0 fpara;
para j:=1 hasta n hacer
para c:=1 hasta Cap hacer
si c<p[j]
entonces
g[j,c]:=g[j-1,c]

sino
si g[j-1,c]g[j-1,c-p[j]]+b[j]
entonces
g[j,c]:=g[j-1,c]
sino

g[j,c]:=g[j-1,c-p[j]]+b[j]
fsi
fsi
fpara
fpara
fin
ANLISIS:
SU complejidad tiene un coste de O(n) debido a los dos for que estn seguidos.
entonces tenemos la tabla

Se implementa el algoritmo recursivo para descurbir quienes son los objetos que van a ingresar
a la mochila
algoritmo prueba(ent j,c:nat)
principio
si j>0 entonces
si c<p[j] entonces prueba(j-1,c)
sino
si g[j-1,c-p[j]]+b[j]>g[j-1,c]
entonces
test(j-1,c-p[j]);
escribir('meter ',j)
sino prueba(j-1,c)
fsi
fsi
fsi
fin
Comienza desde la ultima posicin vemos el 78 y 78 se repite, avanza hacia arriba, como son
diferentes en p1 y p2 es decir tenemos 9 y 6 pesos de objetos que van a la mochila, entonces
ambos entran exacto (son 15 ), teniendo como mximo valor 78
Su complejidad tiene un coste de O(n) porque se ejecuta una vez por cada valor.
HE AQUI su implementacion en c++, Pruebenlo en Codeblocks// alguna duda o sugerencia
solo hganlo saber.o
/*
Autor: daniel Cam Urquizo
Data: 04-07-12
Problema: mochila 1/0 con promatrizramacion dinamica
*/

#include<iostream>
#include<conio.h>
#define max 200

using namespace std;


int matriz[max][max],value[max],pesos[max],cap,sum=0;
void burbuja(int n)
{ int temp,i,j;
for (i=2; i<=n; i++)
for( j=1 ; j<=n - 1; j++)
{

if (pesos[j]< pesos[j+1])
{
temp = pesos[j];
pesos[j] = pesos[j+1];
pesos[j+1] = temp;}}
}
void prueba(int j, int c)
{
if(j>0){
if(c<pesos[j]) prueba(j-1,c);
else {
if((matriz[j-1][c-pesos[j]]+value[j])>matriz[j-1][c]){ prueba(j-1,c-pesos[j]);
cout<<"se tiene "<<pesos[j]<<endl; sum=value[j]+sum;}

else prueba(j-1,c);
}
}
}

void objetos(int n){


prueba(n,cap);
}

void mochila(int n){


int maxint=998;
int c,i,j;
for(c=0;c<=cap;c++) matriz[0][c]=0;
for(j=1;j<=n;j++) matriz[j][0]=0;
for(j=1;j<=n;j++)
for(c=1;c<=cap;c++){
if(c<pesos[j]) matriz[j][c]=matriz[j-1][c];
else {
if(matriz[j-1][c]>=(matriz[j-1][c-pesos[j]]+value[j]))
matriz[j][c]=matriz[j-1][c];
else matriz[j][c]=matriz[j-1][c-pesos[j]]+value[j];

} }
}

int main(){
int i=1,j;
char continuar;

cout<<"\t\t\tWELCOME"<<endl;
cout<<"ingrese peso mochila: "<<endl;
cin>>cap;
cout<<"ingrese peso de objetos : "<<endl;
while(1){
cin>>pesos[i]; i++;
cout<<"desea continuar s/n";
cin>>continuar;
if(continuar=='n') break;}

int mon;
mon=i-1;
burbuja(mon);
for(j=1;j<=mon;j++){
cout<<"valores de peso "<<pesos[j]<<": ";
cin>> value[j]; cout<<endl;}

mochila(mon);

objetos(mon);
/* ver matriz
for(int t=0;t<mon;t++){
for(int h=0;h<cap;h++){
cout<<matriz[t][h];}cout<<endl;}*/
cout<<endl<<sum;

getch();

Das könnte Ihnen auch gefallen