From 336394dc90810fe31c940c7c84de507eaa7c30d8 Mon Sep 17 00:00:00 2001 From: Wenru Dong Date: Wed, 26 Dec 2018 13:26:22 +0000 Subject: [PATCH] 0/1 knapsack problem in python --- python/40_dynamic_programming/knapsack.py | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 python/40_dynamic_programming/knapsack.py diff --git a/python/40_dynamic_programming/knapsack.py b/python/40_dynamic_programming/knapsack.py new file mode 100644 index 0000000..7a71272 --- /dev/null +++ b/python/40_dynamic_programming/knapsack.py @@ -0,0 +1,30 @@ +""" + Author: Wenru Dong +""" + +from typing import List + +def knapsack01(weights: List[int], values: List[int], capacity: int) -> int: + # Denote the state as (i, c), where i is the stage number, + # and c is the capacity available. Denote f(i, c) to be the + # maximum value when the capacity available is c, and Item 0 + # to Item i-1 are to be packed. + # The goal is to find f(n-1, W), where W is the total capacity. + # Then the DP functional equation is: + # f(i, c) = max(xᵢvᵢ + f(i-1, c-xᵢwᵢ)), xᵢ ∈ D, i ≥ 0, + # f(-1, c) = 0, 0 ≤ c ≤ W, + # where + # / {0}, if wᵢ > c + # D = D(i, c) = + # \ {0, 1}, if wᵢ ≤ c + + prev = [0] * (capacity + 1) + for w, v in zip(weights, values): + prev = [c >= w and max(prev[c], prev[c-w] + v) for c in range(capacity + 1)] + return prev[-1] + + +if __name__ == "__main__": + # To find the maximum weight that can be packed, + # set values equal to the weights + print(knapsack01([2, 2, 4, 6, 3], [2, 2, 4, 6, 3], 9))