""" Jeffery Russell 12-1-18 """ def knapsack(V, W, capacity): """ Dynamic programming implementation of the knapsack problem :param V: List of the values :param W: List of weights :param capacity: max capacity of knapsack :return: List of tuples of objects stolen in form (w, v) """ choices = [[[] for i in range(capacity + 1)] for j in range(len(V) + 1)] cost = [[0 for i in range(capacity + 1)] for j in range(len(V) + 1)] for i in range(0, len(V)): for j in range(0, capacity + 1): if W[i] > j: # don't include another item cost[i][j] = cost[i -1][j] choices[i][j] = choices[i - 1][j] else: # Adding another item cost[i][j] = max(cost[i-1][j], cost[i-1][j - W[i]] + V[i]) if cost[i][j] != cost[i-1][j]: choices[i][j] = choices[i - 1][j - W[i]] + [(W[i], V[i])] else: choices[i][j] = choices[i - 1][j] return choices[len(V) -1][capacity] def printSolution(S): """ Takes the output of knapsack and prints it in a pretty format. :param S: list of tuples representing items stolen :return: None """ print("Thief Took:") for i in S: print("Weight: " + str(i[0]) + "\tValue: \t" + str(i[1])) print() print("Total Value Stolen: " + str(sum(int(v[0]) for v in S))) print("Total Weight in knapsack: " + str(sum(int(v[1]) for v in S))) values = [99,1,1,1,1, 1,1] weights = [5,1,2,3,4,5,1] printSolution(knapsack(values, weights, 6))