"""Given weights and values of n items, put these items in a knapsack ofcapacity W to get the maximum total value in the knapsack.Note that only the integer weights 0-1 knapsack problem is solvableusing dynamic programming."""def MF_knapsack(i, wt, val, j):"""This code involves the concept of memory functions. Here we solve the subproblemswhich are needed unlike the below exampleF is a 2D array with -1s filled up"""global F # a global dp table for knapsackif F[i][j] < 0:if j < wt[i - 1]:val = MF_knapsack(i - 1, wt, val, j)else:val = max(MF_knapsack(i - 1, wt, val, j),MF_knapsack(i - 1, wt, val, j - wt[i - 1]) + val[i - 1],)F[i][j] = valreturn F[i][j]def knapsack(W, wt, val, n):dp = [[0 for i in range(W + 1)] for j in range(n + 1)]for i in range(1, n + 1):for w in range(1, W + 1):if wt[i - 1] <= w:dp[i][w] = max(val[i - 1] + dp[i - 1][w - wt[i - 1]], dp[i - 1][w])else:dp[i][w] = dp[i - 1][w]return dp[n][W], dpdef knapsack_with_example_solution(W: int, wt: list, val: list):"""Solves the integer weights knapsack problem returns one ofthe several possible optimal subsets.Parameters---------W: int, the total maximum weight for the given knapsack problem.wt: list, the vector of weights for all items where wt[i] is the weightof the i-th item.val: list, the vector of values for all items where val[i] is the valueof the i-th itemReturns-------optimal_val: float, the optimal value for the given knapsack problemexample_optional_set: set, the indices of one of the optimal subsetswhich gave rise to the optimal value.Examples------->>> knapsack_with_example_solution(10, [1, 3, 5, 2], [10, 20, 100, 22])(142, {2, 3, 4})>>> knapsack_with_example_solution(6, [4, 3, 2, 3], [3, 2, 4, 4])(8, {3, 4})>>> knapsack_with_example_solution(6, [4, 3, 2, 3], [3, 2, 4])Traceback (most recent call last):...ValueError: The number of weights must be the same as the number of values.But got 4 weights and 3 values"""if not (isinstance(wt, (list, tuple)) and isinstance(val, (list, tuple))):raise ValueError("Both the weights and values vectors must be either lists or tuples")num_items = len(wt)if num_items != len(val):raise ValueError("The number of weights must be the ""same as the number of values.\nBut "f"got {num_items} weights and {len(val)} values")for i in range(num_items):if not isinstance(wt[i], int):raise TypeError("All weights must be integers but "f"got weight of type {type(wt[i])} at index {i}")optimal_val, dp_table = knapsack(W, wt, val, num_items)example_optional_set: set = set()_construct_solution(dp_table, wt, num_items, W, example_optional_set)return optimal_val, example_optional_setdef _construct_solution(dp: list, wt: list, i: int, j: int, optimal_set: set):"""Recursively reconstructs one of the optimal subsets givena filled DP table and the vector of weightsParameters---------dp: list of list, the table of a solved integer weight dynamic programming problemwt: list or tuple, the vector of weights of the itemsi: int, the index of the item under considerationj: int, the current possible maximum weightoptimal_set: set, the optimal subset so far. This gets modified by the function.Returns-------None"""# for the current item i at a maximum weight j to be part of an optimal subset,# the optimal value at (i, j) must be greater than the optimal value at (i-1, j).# where i - 1 means considering only the previous items at the given maximum weightif i > 0 and j > 0:if dp[i - 1][j] == dp[i][j]:_construct_solution(dp, wt, i - 1, j, optimal_set)else:optimal_set.add(i)_construct_solution(dp, wt, i - 1, j - wt[i - 1], optimal_set)if __name__ == "__main__":"""Adding test case for knapsack"""val = [3, 2, 4, 4]wt = [4, 3, 2, 3]n = 4w = 6F = [[0] * (w + 1)] + [[0] + [-1 for i in range(w + 1)] for j in range(n + 1)]optimal_solution, _ = knapsack(w, wt, val, n)print(optimal_solution)print(MF_knapsack(n, wt, val, w)) # switched the n and w# testing the dynamic programming problem with example# the optimal subset for the above example are items 3 and 4optimal_solution, optimal_subset = knapsack_with_example_solution(w, wt, val)assert optimal_solution == 8assert optimal_subset == {3, 4}print("optimal_value = ", optimal_solution)print("An optimal subset corresponding to the optimal value", optimal_subset)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。