10. Dynamic Planning (3) -- 0-1 backpack problem, 0-1 backpack
In the previous article "9. Dynamic Planning (2) -- Subsets and problems", we talked about Subsets and problems and their implementations. Backpack problems are actually a subset and a type of problem, but the problem is not "determining the problem" but "optimal problem ". The problem with a backpack is actually divided into "0-1 backpack" and "full backpack". This article explains "0-1 backpack.
Q: There are n items. The weight of each item is weigh [I], and the value of each item is price [I]. Now there is a backpack, the weight of a backpack is W. What is the maximum total value of items that a backpack can hold?
Define s [I, j] to indicate the total value of the first I item, and j is the weight of the backpack. When j = W or W is the closest and less than W, this is the solution to the problem.
The key to "Dynamic Planning" is to find its recursive formula, which usually Splits a problem into two parts based on a certain value as the boundary. The solution to the knapsack problem is the optimal solution for the subset and problem. dynamic Planning (2) -- Analysis of the derivation project of the recursive formula in the subset and problem, and re-analysis and derivation here.
Analysis: s [I, j] indicates the first I items. If the value of the first I-1 item has reached the threshold of carrying weight j, therefore, the I-th item cannot be placed in (j-wi <0), which indicates s [I, j] = s [I-1, j]. However, if the I-1 item does not reach the limits of backpack weight j (j-wi> = 0 ), in this case, the value of the first I-1 item is s [I-1, j-wi]. the value of the I-th item can be expressed as s [I-1, j-wi] + pi.
In conclusion, the recursive formula is obtained:
Example: item weight set w = (2, 4, 1, 5, 3), item price set p = (4, 5, 19, 3, 2 ), the weight of the backpack is 6. Using the recursive formula above, we can use a matrix to represent this backpack problem. The maximum value of the 6th column is the maximum value when the weight of the backpack is 6.
Java
1 package com. algorithm. dynamicprogramming; 2 3 import java. util. arrays; 4 5/** 6*0-1 backpack problem 7 * | s [I-1, j] (j-wi <0) 8 * s [I, j] = | s [I-1, j] 9 * | Max | (j-wi> = 0) 10 * | s [I-1, j-wi] + pi11 * Created by yulinfeng on 7/3/17.12 */13 public class KnapsackProblem {14 public static void main (String [] args) {15 int [] weight = {2, 4, 1, 5, 2}; 16 int [] price = {4, 5, 19, 3, 2 }; 17 int knapsackWeight = 6; 18 int value = knapsackProblem (weight, price, knapsackWeight); 19 System. out. println (value ); 20} 21 22/** 23 * dynamic planning solution 0-1 backpack problem 24 * @ param weight item weight 25 * @ param price item value 26 * @ param knapsackWeight backpack weight 27 * @ return28 */29 private static int knapsackProblem (int [] weight, int [] price, int knapsackWeight) {30 int row = weight. length + 1; 31 int col = knapsackWeight + 1; 32 int [] [] solutionMatrix = new int [row] [col]; 33 int [] values = new int [row]; 34 values [0] = 0; 35 for (int I = 0; I <row; I ++) {36 solutionMatrix [I] [0] = 0; 37} 38 for (int j = 0; j <col; j ++) {39 solutionMatrix [0] [j] = 0; 40} 41 42 for (int I = 1; I <row; I ++) {43 for (int j = 1; j <col; j ++) {44 solutionMatrix [I] [j] = solutionMatrix [I-1] [j]; 45 if (j-weight [I-1]> = 0 & solutionMatrix [I-1] [j-weight [I-1] + price [I-1]> solutionMatrix [I] [j]) {46 solutionMatrix [I] [j] = solutionMatrix [I-1] [j-weight [I-1] + price [I-1]; 47} 48} 49 values [I] = solutionMatrix [I] [col-1]; 50} 51 Arrays. sort (values); 52 return values [values. length-1]; 53} 54}
Python3
1 def knapsack_problem (weight, price, knapsackWeight): 2'''3 0-1 backpack Problem 4 | s [I-1, j] (j-wi <0) 5 s [I, j] = | s [I-1, j] 6 | Max | (j-wi> = 0) 7 | s [I-1, j-wi] + pi 8 9 Created by yulinfeng on 7/3/17.10 ''' 11 row = len (weight) + 112 col = len (price) + 113 solutionMatrix = [[0 for c in range (col)] for r in range (row)] 14 values = [0] * row15 for I in range (row ): 16 solutionMatrix [0] [I] = 017 for j in range (col): 18 solutionMatrix [j] [0] = 019 for m in range (1, row ): 20 for n in range (1, col ): 21 solutionMatrix [m] [n] = solutionMatrix [m-1] [n] 22 if n-weight [m-1]> = 0 and solutionMatrix [m-1] [n -weight [m-1] + price [m-1]> solutionMatrix [m] [n]: 23 solutionMatrix [m] [n] = solutionMatrix [m-1] [n-weight [m-1] + price [m-1] 24 values [m] = solutionMatrix [m] [col-1] 25 26 values. sort () 27 return values [len (values)-1] 28 29 weight = (2, 4, 1, 5, 2) 30 price = (4, 5, 19, 3, 2) 31 knapsackWeight = 632 value = knapsack_problem (weight, price, knapsackWeight) 33 print (value)