problem multiple meaning knapsack c++ algorithm knapsack-problem

c++ - multiple - knapsack problem python



¿Cómo encontrar qué elementos están en la bolsa, usando el Algoritmo de mochila[y no solo el valor de la bolsa]? (3)

Aquí hay una implementación de julia:

function knapsack!{F<:Real}( selected::BitVector, # whether the item is selected v::AbstractVector{F}, # vector of item values (bigger is better) w::AbstractVector{Int}, # vector of item weights (bigger is worse) W::Int, # knapsack capacity (W ≤ ∑w) ) # Solves the 0-1 Knapsack Problem # https://en.wikipedia.org/wiki/Knapsack_problem # Returns the assigment vector such that # the max weight ≤ W is obtained fill!(selected, false) if W ≤ 0 return selected end n = length(w) @assert(n == length(v)) @assert(all(w .> 0)) ########################################### # allocate DP memory m = Array(F, n+1, W+1) for j in 0:W m[1, j+1] = 0.0 end ########################################### # solve knapsack with DP for i in 1:n for j in 0:W if w[i] ≤ j m[i+1, j+1] = max(m[i, j+1], m[i, j-w[i]+1] + v[i]) else m[i+1, j+1] = m[i, j+1] end end end ########################################### # recover the value line = W for i in n : -1 : 1 if line - w[i] + 1 > 0 && m[i+1,line+1] - m[i, line - w[i] + 1] == v[i] selected[i] = true line -= w[i] end end selected end

Ahí tengo un código, que calcula el valor óptimo por el algoritmo de mochila (bin empaquetando el problema de NP-difícil):

int Knapsack::knapsack(std::vector<Item>& items, int W) { size_t n = items.size(); std::vector<std::vector<int> > dp(W + 1, std::vector<int>(n + 1, 0)); for (size_t j = 1; j <= n; j++) { for ( int w = 1; w <= W; w++) { if (items[j-1].getWeight() <= w) { dp[w][j] = std::max(dp[w][j-1], dp[w - items[j-1].getWeight()][j-1] + items[j-1].getWeight()); } else { dp[w][j] = dp[w][j - 1]; } } } return dp[W][n]; }

También necesito que se muestren los elementos, incluidos en el paquete. Quiero crear una matriz, para poner allí un elemento añadido. Entonces, la pregunta es en qué paso colocar esta adición, o tal vez, ¿hay alguna otra forma más eficiente de hacerlo?

Pregunta: Quiero poder conocer los elementos que me dan la solución óptima, y ​​no solo el valor de la mejor solución.

PD. Lo siento por mi inglés, no es mi idioma nativo.


puede obtener los elementos que empaqueta de la matriz utilizando los datos de la matriz, sin almacenar ningún dato adicional.
pseudo codigo

line <- W i <- n while (i> 0): if dp[line][i] - dp[line - weight(i)][i-1] == value(i): the element ''i'' is in the knapsack i <- i-1 //only in 0-1 knapsack line <- line - weight(i) else: i <- i-1

La idea que hay detrás : iterar la matriz, si la diferencia de peso es exactamente el tamaño del elemento, está en la mochila.
Si no lo está: el artículo no está en la mochila, continúe sin él.


line <- W i <- n while (i> 0): if dp[line][i] - dp[line - weight(i) ][i-1] == value(i): the element ''i'' is in the knapsack cw = cw - weight(i) i <- i-1 else if dp[line][i] > dp[line][i-1]: line <- line - 1 else: i <- i-1

Solo recuerda cómo llegaste a dp [line] [i] cuando agregaste el elemento i

dp[line][i] = dp[line - weight(i) ][i - 1] + value(i);