[Universo de algoritmos - Algoritmos de aprendizaje en historias] Mochila dp Problema completo de mochila

Los estudiantes no lo transmiten de generación en generación, pero Zizhang Mingyue es todo lo contrario, Zilai no gana ni pierde en este asunto.

prefacio

Si bien la informática es un tema riguroso, es precisamente por el rigor que debe ser interesante de leer. En los primeros artículos sobre algoritmos del autor, usé una historia corta como introducción para presentar el algoritmo, pero cuando miré hacia atrás, descubrí que el sabor académico todavía era demasiado fuerte y no quería leerlo en absoluto. Orz~ entonces el autor Decidió reorganizar la estructura del artículo y presentar todo el algoritmo en forma de historia, al menos para que los lectores lo lean, ¡y espero ayudar a todos!

texto

El viaje de aventuras de Xiao Ming (2)

Como se mencionó anteriormente, después de que Xiao Ming empacó su equipo de casa, se embarcó en una expedición al vasto mar de estrellas. Después de navegar durante varios días, llegó al primer planeta: la estrella de la alabarda. Este planeta es famoso por su comida cara y deliciosa, como Xiao Ming tenía tanta hambre, fue directamente a un restaurante buffet, tratando de recuperar su sangre.

Xiao Ming no pudo evitar babear al ver estos alimentos: ¡Hay tantos deliciosos que tengo muchas ganas de comerlos! Pero cómo comer es la mejor manera de comer. . (Nota: el estándar para que Xiao Ming coma bien es que la suma de todos los alimentos que come tenga el precio más alto, es decir, el más rentable)

(Xiao Ming piensa por un momento)

Xiao Ming: Siento que este problema es muy similar al problema cuando moví el equipo, pero esta vez toda la comida es ilimitada. . ¡Piense en la ecuación de transferencia utilizada anteriormente!
inserte la descripción de la imagen aquí

Entonces, antes solo había un equipo, pero esta vez hay innumerables piezas de comida, es decir, no tiene que ser jw[i], también puede ser j-2 w[i], j-3 w[ i ] ...Entonces, sí
inserte la descripción de la imagen aquí
, pero en este caso, la complejidad del tiempo es demasiado grande... Incluso si se usa la optimización de matriz rodante, la complejidad del tiempo alcanzará el nivel del cuadrado, y se deben realizar juicios de límites complejos. hacerse...

(Xiao Ming se puso a pensar mucho y su intuición le dijo que este algoritmo aún se puede optimizar, pero con su conocimiento, no pudo resolverlo. Al final, Xiao Ming solo pudo seguir calculando de acuerdo con este algoritmo, y Cuando se completó el cálculo, cuando fue a recoger la comida con su cuerpo hambriento, descubrió que era hora de cerrar. Xiao Ming no tuvo más remedio que comprar un panqueque en la calle, y mientras lo comía con lágrimas en los ojos. su cara, juró que definitivamente aprendería bien el algoritmo...)

optimización final

De hecho, la intuición de Xiao Ming es muy precisa, pero desafortunadamente su coeficiente intelectual no es tan fuerte como su intuición ~ Entonces, tomemos el control de su pensamiento y veamos qué se puede optimizar a continuación.
Obviamente, todavía se puede optimizar con matrices de desplazamiento esta vez, pero para la conveniencia de la demostración, primero comprimimos a dos líneas i e i-1:

El bloque amarillo es el valor que queremos determinar actualmente, es decir, fi , j. El bloque rojo es el valor que enumeramos de acuerdo con la fórmula anterior. Sea w[i]=2, entonces:
inserte la descripción de la imagen aquí
el siguiente paso es la clave punto, determinemos fi , la tabla en , el bloque amarillo es el valor a determinar, y el bloque rojo es el valor enumerado:
inserte la descripción de la imagen aquí

¿Que encontraste? El valor de fi , j-2 es en realidad el valor máximo de todos los bloques rojos excepto fi -1, j , entonces podemos comparar solo los dos bloques de fi , j-2 y fi -1, j . se puede obtener el valor de fi ,j , es decir,
inserte la descripción de la imagen aquí
esta es la ecuación de transferencia del problema de la mochila completo. A continuación, el código:

el código

#include <iostream>
using namespace std;
const int maxn = 13010;
int n, W, w[maxn], v[maxn], f[maxn];

int main() {
    
    
  cin >> n >> W;
  for (int i = 1; i <= n; i++) cin >> w[i] >> v[i]; 
  for (int i = 1; i <= n; i++)//循环n次,因为要对n件物品进行选择
    for (int l = w[i]; l <= W; l++)//从前向后更新
      f[l] = max(f[l], f[l - w[i]] + v[i]);//转移方程
  cout << f[W];
  return 0;

Finalmente, haré una pequeña nota de un problema sobre el procesamiento de límites que el autor pensó al escribir este blog: cuando l<w[i], es imposible tomar el i-ésimo elemento, por lo que los datos en la matriz no se puede cambiar; y al principio Dado que la definición es una variable global, los datos se inicializan en 0, lo que también es coherente con el hecho de que el valor es 0 si el elemento no se recupera todo el tiempo, por lo que no hay problema no tratar con el límite especialmente.
Por favor agregue una descripción de la imagen
Soy Shuang_Ai, un recién llegado que trabaja duro en el camino de los algoritmos, ¡gracias por leer! El texto del código no es fácil, si crees que es bueno, puedes prestarle atención, ¡traeré explicaciones de algoritmos cada vez más completas en el futuro!

Supongo que te gusta

Origin blog.csdn.net/m0_72987309/article/details/130250651
Recomendado
Clasificación