This action will force synchronization from 编程语言算法集/Python, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
"""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)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。