From 60d0ceae4f0e1b83ab5b54958026127a0a1c009e Mon Sep 17 00:00:00 2001 From: snigdha510 Date: Wed, 15 May 2024 11:06:10 +0530 Subject: [PATCH 1/3] Implementation of the Knapsack Problem Solver #11401 --- knapsack/dp_knapsack.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 knapsack/dp_knapsack.py diff --git a/knapsack/dp_knapsack.py b/knapsack/dp_knapsack.py new file mode 100644 index 000000000000..7a8fa0076238 --- /dev/null +++ b/knapsack/dp_knapsack.py @@ -0,0 +1,30 @@ +def knapsack_dp(capacity: int, weights: list[int], values: list[int]) -> int: + """ + Returns the maximum value that can be put in a knapsack of a given capacity, + with each weight having a specific value. + + Uses a dynamic programming approach to solve the 0/1 Knapsack Problem. + + >>> capacity = 50 + >>> values = [60, 100, 120] + >>> weights = [10, 20, 30] + >>> knapsack_dp(capacity, weights, values) + 220 + """ + n = len(weights) + dp = [[0 for _ in range(capacity + 1)] for _ in range(n + 1)] + + # Build table dp[][] in a bottom-up manner + for i in range(1, n + 1): + for w in range(1, capacity + 1): + if weights[i - 1] <= w: + dp[i][w] = max(values[i - 1] + dp[i - 1][w - weights[i - 1]], dp[i - 1][w]) + else: + dp[i][w] = dp[i - 1][w] + + return dp[n][capacity] + + +if __name__ == "__main__": + import doctest + doctest.testmod() From ca6c54e7e61041f7b440f362745af35acac111e9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 15 May 2024 05:42:29 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- knapsack/dp_knapsack.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/knapsack/dp_knapsack.py b/knapsack/dp_knapsack.py index 7a8fa0076238..159412d9ab3d 100644 --- a/knapsack/dp_knapsack.py +++ b/knapsack/dp_knapsack.py @@ -18,7 +18,9 @@ def knapsack_dp(capacity: int, weights: list[int], values: list[int]) -> int: for i in range(1, n + 1): for w in range(1, capacity + 1): if weights[i - 1] <= w: - dp[i][w] = max(values[i - 1] + dp[i - 1][w - weights[i - 1]], dp[i - 1][w]) + dp[i][w] = max( + values[i - 1] + dp[i - 1][w - weights[i - 1]], dp[i - 1][w] + ) else: dp[i][w] = dp[i - 1][w] @@ -27,4 +29,5 @@ def knapsack_dp(capacity: int, weights: list[int], values: list[int]) -> int: if __name__ == "__main__": import doctest + doctest.testmod() From fd1c65297c8b6e91cd93d88354550c48f0a24c70 Mon Sep 17 00:00:00 2001 From: snigdha510 Date: Fri, 17 May 2024 11:33:51 +0530 Subject: [PATCH 3/3] Minor fixes --- knapsack/dp_knapsack.py | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/knapsack/dp_knapsack.py b/knapsack/dp_knapsack.py index 159412d9ab3d..3e0c395ffb00 100644 --- a/knapsack/dp_knapsack.py +++ b/knapsack/dp_knapsack.py @@ -5,22 +5,46 @@ def knapsack_dp(capacity: int, weights: list[int], values: list[int]) -> int: Uses a dynamic programming approach to solve the 0/1 Knapsack Problem. - >>> capacity = 50 + >>> capacity = 50 >>> values = [60, 100, 120] >>> weights = [10, 20, 30] >>> knapsack_dp(capacity, weights, values) 220 + + >>> capacity = 0 + >>> values = [60, 100, 120] + >>> weights = [10, 20, 30] + >>> knapsack_dp(capacity, weights, values) + 0 + + >>> capacity = 10 + >>> values = [10, 10, 10] + >>> weights = [5, 5, 5] + >>> knapsack_dp(capacity, weights, values) + 20 + + >>> capacity = 100 + >>> values = [60, 100, 120, 80, 30] + >>> weights = [10, 20, 30, 40, 50] + >>> knapsack_dp(capacity, weights, values) + 300 + + >>> capacity = 7 + >>> values = [1, 4, 5, 7] + >>> weights = [1, 3, 4, 5] + >>> knapsack_dp(capacity, weights, values) + 9 """ + n = len(weights) dp = [[0 for _ in range(capacity + 1)] for _ in range(n + 1)] - # Build table dp[][] in a bottom-up manner for i in range(1, n + 1): for w in range(1, capacity + 1): if weights[i - 1] <= w: - dp[i][w] = max( - values[i - 1] + dp[i - 1][w - weights[i - 1]], dp[i - 1][w] - ) + value_included = values[i - 1] + dp[i - 1][w - weights[i - 1]] + value_excluded = dp[i - 1][w] + dp[i][w] = max(value_included, value_excluded) else: dp[i][w] = dp[i - 1][w]