Colección de citas famosas - Slogan de motivación - 01 Problema con la mochila

01 Problema con la mochila

0/1 Mochila

Un viajero tiene una mochila que puede contener hasta m kilogramos. Hay n artículos y sus pesos son W1, W2,..., Wn,. sus valores son C1, C2,..., Cn respectivamente. Si solo hay un artículo de cada tipo, el viajero puede obtener el valor total máximo.

<1>Explicación del análisis:

Obviamente, esta pregunta puede utilizar el método de profundidad primero para enumerar cada elemento (seleccionar o no seleccionar el control 0,1).

El programa es simple, pero cuando el valor de n es grande, no puede cumplir con los requisitos de tiempo y la complejidad del tiempo es O (2n). Según la idea de recursividad, podemos descomponer el problema en subproblemas y usar funciones recursivas

Supongamos que f (i, x) representa los primeros i elementos y el peso total no excede el valor óptimo de x

Entonces f(i,x)=max(f(i-1,x-W[i])+C[i],f(i-1,x))

f(n,m ) es la solución óptima y las condiciones de contorno son f (0, x) = 0, f (i, 0) = 0

El método de programación dinámica (; método de deducción secuencial) el procedimiento es el siguiente:

El programa es el siguiente:

programa knapsack02;

const maxm=200;maxn=30;

escriba ar=array[1..maxn] de entero;

var m,n,j,i:integer;

c,w:ar;

f:array[0..maxn,0 ..maxm] de entero;

función max(x,y:integer):integer;

comenzar

si x>y entonces max:=x else max:=y;

fin;

comienzo

readln(m, n);

para i:= 1 a n hacer

readln(w[i],c[i]);

para i:=1 a m hacer f(0,i):=0;

para i:=1 a n hacer f(i,0):=0

para i:=1; to n do

for j:=1 to m do

comenzar

si j>=w[i] entonces f[i,j]:= max(f[i-1,j-w[i]]+c[ i],f[i-1,j])

más f[i,j]:=f[i-1, j];

fin;

writeln(f[n,m]);

fin.