El problema de la mochila: el atraco al museo

describir

El ladrón se cuela en el museo, y hay 5 tesoros frente a él, cada uno con peso y valor. La mochila del ladrón solo puede llevar 20 catties. ¿Cómo elegir el tesoro con el valor total más alto?

La relación correspondiente es la siguiente:

número del tesoro peso valor
1 2 3
2 3 4
3 4 8
4 5 8
5 9 10

analizar

valor = f ( n , w ) valor = f(n, w)valor _ _ _ _=f ( norte ,w ) es el valor máximo del n-ésimo tesoro que se puede obtener bajo el límite de peso de w, n(1<=n<=5) el número actual de tesoros, y w(1<=w<=20) es el peso de todos los tesoros.

通过valor = f ( n , w ) valor = f(n, w)valor _ _ _ _=f ( norte ,w ) Se puede construir una tabla de datos bidimensional con n filas y m columnas, y el valor representa el valor máximo de la combinación actual.

  1. Si uno de n o w es 0, entonces el valor es 0;
  2. Si el peso del enésimo tesoro excede el límite de peso de la mochila actual, es decir, no puede contener el enésimo tesoro, y el valor máximo es igual al valor de no cargar este tesoro, entonces es igual al n- 1º tesoro producido bajo la misma combinación de w valor máximo.
  3. Si puede sostener el tesoro n, el valor máximo es max (el valor del tesoro n sin el tesoro n, el valor del tesoro n), y el valor del tesoro n = f (cuando el tesoro es n-1 y deducir el valor máximo del límite de peso del tesoro actual + el valor del tesoro actual)
    • El motivo para deducir el valor máximo del límite de peso del tesoro actual: después de colocar el enésimo tesoro, el límite de peso de la mochila debe restarse del peso del enésimo tesoro
    • + El valor actual de este tesoro: después de colocar el enésimo tesoro, el valor se incluirá naturalmente en él

F ( norte , w ) = { 0 si norte = 0 o w = 0 F ( norte - 1 , w ) si wn > wmax ( F ( norte - 1 , w ) , F ( norte - 1 , w - wn ) + valuei ) si wn < wf(n, w) = \begin{dcases} 0 &\text{if } ~ n=0 ~~ o ~~ w=0 \\ f(n-1, w) &\text{ if } ~ w_n > w \\ max(f(n-1, w), f(n-1, w-w_n) + value_i) &\text{if } ~ w_n < w \end{dcases}f ( norte ,w )= 0f ( norte1 ,w )máximo x ( f ( norte1 ,w ) ,f ( norte1 ,wwn)+valor _ _ _ _yo)si  n =0 o w    =0si  w n>wsi  w n<w

el código

weight_value = [None,
                {
    
    'w': 2, 'v': 3}, {
    
    'w': 3, 'v': 4},
                {
    
    'w': 4, 'v': 8}, {
    
    'w': 5, 'v': 8}, {
    
    'w': 9, 'v': 10}]

max_weight = 20
values = {
    
    (n, w): 0 for n in range(len(weight_value)) for w in range(max_weight + 1)}

# 填写二维表格
for n in range(1, len(weight_value)):
    for w in range(1, max_weight + 1):
        # 如果装不下第n个宝物,最大价值等于不装此宝物的价值
        if weight_value[n]['w'] > w:
            values[(n, w)] = values[(n - 1, w)]
        # 如果能装下第n个宝物,最大价值为max(不装此宝物的价值, 装此宝物的价值)
        else:
            # 装此宝物的价值=宝物为n-1件时and扣除当前宝物的重量限制的最大价值+当前这件宝物的价值
            values[(n, w)] = max(values[(n - 1, w)], values[(n - 1, w - weight_value[n]['w'])] + weight_value[n]['v'])

if __name__ == '__main__':
    print(values[(len(weight_value) - 1, max_weight)])

输出: 29

Detalles de visualización bidimensional

  • f(5, 20) es el valor máximo correspondiente

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Zeus_daifu/article/details/128437441
Recomendado
Clasificación