Red de conocimiento del abogados - Ley de patentes - ¿Cómo entender el problema de la mochila 0-1 en programación dinámica? Solicite ejemplos específicos y pasos detallados. . .

¿Cómo entender el problema de la mochila 0-1 en programación dinámica? Solicite ejemplos específicos y pasos detallados. . .

Responde a tu pregunta citando la publicación del blog de un amigo.

Descripción

Intente diseñar una función que utilice el método de retroceso para buscar en el árbol espacial del subconjunto. Los parámetros de esta función incluyen funciones necesarias, como la función de determinación de viabilidad del nodo y la función de límite superior, y esta función se utiliza para resolver el problema de la mochila 0-1.

El problema de la mochila 0-1 se describe de la siguiente manera: dados n artículos y una mochila. El peso del artículo i es wi, su valor es vi y la capacidad de la mochila es C. ¿Cómo debemos elegir los artículos para poner en la mochila para maximizar el valor total de los artículos en la mochila?

Al elegir los artículos para poner en la mochila, solo hay 2 opciones para cada artículo Yo, es decir, metido en la mochila o no empacado en una mochila. El artículo que no puedo

cargarse en la mochila varias veces, ni solo una parte del artículo que debo cargar.

Entrada

Los datos de entrada vienen dados por el archivo input.txt. La primera línea contiene 2 enteros positivos n y c. n es la cantidad de artículos y c es la capacidad de la mochila. Hay n números enteros positivos en la siguiente línea, que representan el valor del artículo. Hay n números enteros positivos en la línea 3, que representan el peso del artículo.

Salida

Envíe el valor máximo calculado y el plan de carga óptimo de los artículos cargados en la mochila al archivo salida.txt.

Entrada de muestra

5 10

6 3 5 4 6

2 2 6 5 4

Muestra Salida

15

1 1 0 0 1

Fuente

//código c++

#include

#include

#include

int min(int w,int c)

{int temp;

if (w

else

temp=c;

return temp;

}

int max(int ​​​​w,int c)

{

int temp;

if (w>c) temp=w ;

else

temp=c;

return temp;

}

mochila vacía(int v [] ,int w[],int c,int n,int**m) //Encontrar el valor óptimo

{

int jmax=min(w[n]- 1, c);

for(int j=0;j<=jmax;j++)

m[n][j]=0;

for( int jj=w[n];jj<=c;jj++)

m[n][jj]=v[n];

for(int i=n -1 ;i>1;i--){

jmax=min(w[i]-1,c);

for(int j=0;j<= jmax; j++)

m[i][j]=m[i+1][j];

for(int jj=w[i];jj<=c ;jj++ )

m[i][jj]=max(m[i+1][jj],m[i+1][jj-w[i]]+v[i]) ;

}

m[1][c]=m[2][c];

si(c>=w[1])

m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]);

cout<

}

int traceback(int **m,int w[],int c,int n,int x[] ) / /Sustitución inversa, encuentre la solución óptima

{

//cout<<"El conjunto de soluciones óptimas obtenido es el siguiente:"<

for(int i=1;i

si(m[i][c]==m[i+1][c]) x[i]=0 ;

más {x[i]=1;

c-=w[i];}

x[n]=(m[n] [c] )?1:0;

for(int y=1;y<=n;y++)

{

cout<

}

cout<

return x[n];

}

int main()

{

int n,c;

int **m ;

cin>>n>>c;

int *v=nuevo int[n+1];

for(int i=1;i <=n;i++)

cin>>v[i];

int *w=nuevo int[n+1];

for(int j=1;j<=n;j++)

cin>>w[j];

int *x=nuevo int[n+1];

m=new int*[n+1]; //Asignación dinámica de matriz bidimensional

for(int p=0;p

{

m[p]=new int[c+1];

}

mochila(v,w,c,n,m);

traceback(m,w,c,n,x);

eliminar []x;

eliminar []w;

eliminar []v;

devolver 0;

}