Notas de estudio de la mochila

Prefacio: La mochila se ha aprendido innumerables veces, esta vez finalmente puedo recordar algo QAQ

----------------

La mochila es un modelo importante y especial en DP lineal.

0/1 mochila

Dados los elementos $ n $, el elemento $ i $ tiene un volumen de $ w_ {i} $ y un valor de $ c_ {i} $. Ahora déle una mochila con un volumen de $ m $, ¿cómo elegir maximizar el valor total de los artículos?

Primero consideramos el algoritmo ingenuo.

Deje que $ f [i] [j] $ sea el valor máximo obtenido al considerar los primeros elementos de $ i $ y seleccionar los elementos con un volumen total de $ j $ para poner en la mochila.

Si no selecciona el elemento $ i $, entonces $ f [i] [j] = f [i-1] [j] $.

Si selecciona el elemento $ i $, entonces $ f [i] [j] = f [i-1] [j-w_ {i}] + c_ {i} (j \ geq w_ {i}) $. Toma el máximo de los dos.

Considere la optimización: porque al considerar el elemento $ i $, solo depende de la situación al considerar el elemento $ i-1 $, por lo que se puede omitir la primera dimensión de la matriz $ f $ anterior.

即 $ f [j] = max (f [j], f [jw [i]] + c [i]) $。

Tenga en cuenta: $ j $ bucles en orden inverso. Suponiendo un bucle de secuencia positiva: por ejemplo, para actualizar $ jw {i} $ con la situación de $ j-2w_ {i} $, en este momento $ jw {i} $ ha pasado a la etapa $ i $ th y se recicla a $ jw { Cuando i} $, se produce la situación de que "la etapa $ i $ th actualiza la etapa $ i $ th", lo que viola el principio de DP lineal. El ciclo de orden inverso garantiza que cada elemento solo se considerará una vez, de acuerdo con el principio de DP lineal.

-------------------------------

Mochila completa

Es similar a la mochila 0/1, excepto que se agrega una condición: cada elemento se puede seleccionar innumerables veces.

 

La única diferencia con la mochila 0/1: $ j $ es un ciclo de secuencia positiva. Porque cada elemento se puede seleccionar innumerables veces.

$ f [j] = max (f [j], f [j-w_ {i}] + c_ {i} $。

-------------------------------------

Mochila múltiple

Las condiciones son diferentes a las de una mochila llena: cada elemento se puede seleccionar $ t_ {i} $ veces.

La forma más simple es, por supuesto, pasar de $ 0 $ a $ t_ {i} $ e intentar nuevamente en cada caso. Pero la complejidad es mayor.

Podemos usar el método de división binaria . Como todos sabemos, $ 2 ^ 0,2 ^ 1,2 ^ 2, ..., 2 ^ k-1 $ pueden representar todos los enteros desde $ 0 $ hasta $ 2 ^ k -1 $. Entonces podemos usar este método para dividir los elementos en binario. Si $ r_ {i} = c_ {i} -2 ^ 0-2 ^ 1 -...- 2 ^ p $, se puede dividir en $ p + 2 $ elementos, y el volumen es $ 2 ^ 0 * w_ {i}, 2 ^ 1 * w_ {i}, ..., 2 ^ p * w_ {i}, r_ {i} * w_ {i} $. Este método divide los elementos en $ logc_ {i} $, que es más eficiente.

------------------

Mochila grupal

Cambios de condición: hay $ i $ grupos de artículos, cada grupo de artículos tiene $ k $ artículos, y cada grupo puede seleccionar como máximo un artículo para obtener el máximo valor.

Realice directamente la selección del ciclo $ k $, siempre que se complete la selección, pasará inmediatamente de la etapa $ i $ al estado $ i + 1 $.

for ( int i = 1 ; i <= n; i ++ )
     for ( int j = m; j> = 0 ; j-- )
         for ( int k = 1 ; k <= c [i]; k ++ )
             if (j > = v [i] [k]) f [j] = max (f [j], f [iv [i] [k]) + w [i] [k]

 

Tenga en cuenta que el ciclo $ k $ debe estar dentro del ciclo $ j $.

Supongo que te gusta

Origin www.cnblogs.com/Invictus-Ocean/p/12694265.html
Recomendado
Clasificación