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; p>
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.