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.
- Si uno de n o w es 0, entonces el valor es 0;
- 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.
- 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 ( norte−1 ,w )máximo x ( f ( norte−1 ,w ) ,f ( norte−1 ,w−wn)+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