From ff62b1d30b30c5bc5c6bc584713824ab7a8027cf Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Fri, 1 Oct 2021 15:31:57 +0530 Subject: [PATCH 01/11] Create README.md --- Knapsack/0-1 Knapsack/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Knapsack/0-1 Knapsack/README.md diff --git a/Knapsack/0-1 Knapsack/README.md b/Knapsack/0-1 Knapsack/README.md new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Knapsack/0-1 Knapsack/README.md @@ -0,0 +1 @@ + From cd3408ea061edb4262b899137a6ead7ca50e6237 Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Fri, 1 Oct 2021 15:32:11 +0530 Subject: [PATCH 02/11] Create README.md --- Knapsack/0-1 Knapsack/Images/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Knapsack/0-1 Knapsack/Images/README.md diff --git a/Knapsack/0-1 Knapsack/Images/README.md b/Knapsack/0-1 Knapsack/Images/README.md new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Knapsack/0-1 Knapsack/Images/README.md @@ -0,0 +1 @@ + From 91bbcca2a60ccb2bf19fc579febf2f3645c4c73a Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Fri, 1 Oct 2021 15:34:44 +0530 Subject: [PATCH 03/11] Create 0-1_knapsack_brute_force.py --- .../0-1_knapsack_brute_force.py | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 Knapsack/0-1 Knapsack/Brute Force Method/0-1_knapsack_brute_force.py diff --git a/Knapsack/0-1 Knapsack/Brute Force Method/0-1_knapsack_brute_force.py b/Knapsack/0-1 Knapsack/Brute Force Method/0-1_knapsack_brute_force.py new file mode 100644 index 00000000..72b197f8 --- /dev/null +++ b/Knapsack/0-1 Knapsack/Brute Force Method/0-1_knapsack_brute_force.py @@ -0,0 +1,88 @@ +# A naive recursive implementation +# of 0-1 Knapsack Problem +# Brute Force Method + +# Problem Statement : Returns the maximum value that +# can be put in a knapsack of +# capacity W + +# Author : Abhishek Sharma, 2021 + +# ----------------------------------------------------------------- + +# Solution for the above problem statement using Python 3 language. +# Approach : Brute Force Method + +# ----------------------------------------------------------------- + +# This is the main function which will provide us maximum value that +# can be put in the capacity of W + +def knapSack(W, wt, val, n): + + # Base Case + if n == 0 or W == 0: + return 0 + + # If weight of the nth item is + # more than Knapsack of capacity W, + # then this item cannot be included + # in the optimal solution + + if (wt[n-1] > W): + return knapSack(W, wt, val, n-1) + + # return the maximum of two cases: + # (1) nth item included + # (2) not included + + else: + return max( + val[n-1] + knapSack( + W-wt[n-1], wt, val, n-1), + knapSack(W, wt, val, n-1)) + + +# end of function knapSack + + +#Driver Code +val = [60, 100, 120] +wt = [10, 20, 30] +W = 50 +n = len(val) +print ("- 0-1 Knapsack Problem using Brute Force Method - ") +print ("-----------------------------------------------------") +print () +print ("The values given : ") +print (val) +print ("-----------------------------------------------------") +print ("The corresponding weights are :") +print (wt) +print ("-----------------------------------------------------") +print ("The maximum capacity can be : ") +print (W) +print () +print ("-----------------------------------------------------") +print ("Output :\nMaximum total value of the Knapsack : ") +print (knapSack(W, wt, val, n)) + +# ----------------------------------------------------------------- +# Input given : +# The values given : +# [60, 100, 120] +# ----------------------------------------------------- +# The corresponding weights are : +# [10, 20, 30] +# ----------------------------------------------------- +# The maximum capacity can be : +# 50 + +# ----------------------------------------------------- +# Output : +# Maximum total value of the Knapsack : +# 220 + +# ----------------------------------------------------------------- + +# Code contributed by, Abhishek Sharma, 2021 From 9c087305632987721084f5397a5b7d5464ba1fd0 Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Fri, 1 Oct 2021 15:44:34 +0530 Subject: [PATCH 04/11] Create README.md --- .../0-1 Knapsack/Brute Force Method/README.md | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 Knapsack/0-1 Knapsack/Brute Force Method/README.md diff --git a/Knapsack/0-1 Knapsack/Brute Force Method/README.md b/Knapsack/0-1 Knapsack/Brute Force Method/README.md new file mode 100644 index 00000000..53eec331 --- /dev/null +++ b/Knapsack/0-1 Knapsack/Brute Force Method/README.md @@ -0,0 +1,49 @@ +# 0-1 Knapsack Problem using Brute Force Method +Language used : Python 3 + +## ๐Ÿ“ƒ Approach +A simple solution is to consider all subsets of items and calculate the total weight and value of all subsets. Consider the only subsets whose total weight is smaller than W. From all such subsets, pick the maximum value subset. +Optimal Sub-structure: To consider all subsets of items, there can be two cases for every item. + +- **Case 1:** The item is included in the optimal subset. +- **Case 2:** The item is not included in the optimal set. + +Therefore, the maximum value that can be obtained from โ€˜nโ€™ items is the max of the following two values. +- Maximum value obtained by n-1 items and W weight (excluding nth item). +- Value of nth item plus maximum value obtained by n-1 items and W minus the weight of the nth item (including nth item). + +If the weight of โ€˜nthโ€™ item is greater than โ€˜Wโ€™, then the nth item cannot be included and Case 1 is the only possibility. + +## ๐Ÿงฎ Algorithm +It should be noted that the above function computes the same sub-problems again and again. See the following recursion tree, K(1, 1) is being evaluated twice. The time complexity of this naive recursive solution is exponential (2^n). + +``` +In the following recursion tree, K() refers +to knapSack(). The two parameters indicated in the +following recursion tree are n and W. +The recursion tree is for following sample inputs. +wt[] = {1, 1, 1}, W = 2, val[] = {10, 20, 30} + K(n, W) + K(3, 2) + / \ + / \ + K(2, 2) K(2, 1) + / \ / \ + / \ / \ + K(1, 2) K(1, 1) K(1, 1) K(1, 0) + / \ / \ / \ + / \ / \ / \ +K(0, 2) K(0, 1) K(0, 1) K(0, 0) K(0, 1) K(0, 0) +Recursion tree for Knapsack capacity 2 +units and 3 items of 1 unit weight. +``` + +## โฐ Complexity Analysis: +- **Time Complexity:** `O(2^n)`. [As there are redundant subproblems.] +- **Auxiliary Space :** `O(1)`. [As no extra data structure has been used for storing values.] + +--------------------------------------------------------------- +## ๐Ÿ–‹๏ธ Author +**Code contributed by, _Abhishek Sharma_, 2021 [@abhisheks008](github.com/abhisheks008)** + +[![forthebadge made-with-python](http://ForTheBadge.com/images/badges/made-with-python.svg)](https://www.python.org/) From 451fb8d656647f52209c0e12088885b16a8a045a Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Fri, 1 Oct 2021 15:57:16 +0530 Subject: [PATCH 05/11] Create 0-1_knapsack_dynamic.py --- .../Dynamic Method/0-1_knapsack_dynamic.py | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Knapsack/0-1 Knapsack/Dynamic Method/0-1_knapsack_dynamic.py diff --git a/Knapsack/0-1 Knapsack/Dynamic Method/0-1_knapsack_dynamic.py b/Knapsack/0-1 Knapsack/Dynamic Method/0-1_knapsack_dynamic.py new file mode 100644 index 00000000..73c4bbf8 --- /dev/null +++ b/Knapsack/0-1 Knapsack/Dynamic Method/0-1_knapsack_dynamic.py @@ -0,0 +1,79 @@ +# A Dynamic Programming based Python +# Program for 0-1 Knapsack problem +# Returns the maximum value that can +# be put in a knapsack of capacity W + +# Problem Statement : Returns the maximum value that +# can be put in a knapsack of +# capacity W + +# Author : Abhishek Sharma, 2021 + +# ----------------------------------------------------------------- + +# Solution for the above problem statement using Python 3 language. +# Approach : Dynamic Method + +# ----------------------------------------------------------------- + +# This is the main function which will provide us maximum value that +# can be put in the capacity of W + +def knapSack(W, wt, val, n): + K = [[0 for x in range(W + 1)] for x in range(n + 1)] + + # Build table K[][] in bottom up manner + for i in range(n + 1): + for w in range(W + 1): + if i == 0 or w == 0: + K[i][w] = 0 + elif wt[i-1] <= w: + K[i][w] = max(val[i-1] + + K[i-1][w-wt[i-1]], + K[i-1][w]) + else: + K[i][w] = K[i-1][w] + + return K[n][W] + + +# Driver code +val = [60, 100, 120] +wt = [10, 20, 30] +W = 50 +n = len(val) +print ("- 0-1 Knapsack Problem using Dynamic Method - ") +print ("-----------------------------------------------------") +print () +print ("The values given : ") +print (val) +print ("-----------------------------------------------------") +print ("The corresponding weights are :") +print (wt) +print ("-----------------------------------------------------") +print ("The maximum capacity can be : ") +print (W) +print () +print ("-----------------------------------------------------") +print ("Output :\nMaximum total value of the Knapsack : ") +print (knapSack(W, wt, val, n)) + +# ----------------------------------------------------------------- +# Input given : +# The values given : +# [60, 100, 120] +# ----------------------------------------------------- +# The corresponding weights are : +# [10, 20, 30] +# ----------------------------------------------------- +# The maximum capacity can be : +# 50 + +# ----------------------------------------------------- +# Output : +# Maximum total value of the Knapsack : +# 220 + +# ----------------------------------------------------------------- + +# Code contributed by, Abhishek Sharma, 2021 From ee3d330a96cd25d4ac6f15c2e9dea468ec00dc7e Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Fri, 1 Oct 2021 16:11:41 +0530 Subject: [PATCH 06/11] Create README.md --- .../0-1 Knapsack/Dynamic Method/README.md | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 Knapsack/0-1 Knapsack/Dynamic Method/README.md diff --git a/Knapsack/0-1 Knapsack/Dynamic Method/README.md b/Knapsack/0-1 Knapsack/Dynamic Method/README.md new file mode 100644 index 00000000..5a5e9fbd --- /dev/null +++ b/Knapsack/0-1 Knapsack/Dynamic Method/README.md @@ -0,0 +1,76 @@ +# 0-1 Knapsack Problem using Dynamic Method +Language used : Python 3 + +## ๐Ÿ“ƒ Approach +In the Dynamic programming we will work considering the same cases as mentioned in the recursive approach. In a `DP[][]` table letโ€™s consider all the possible weights from โ€˜1โ€™ to โ€˜Wโ€™ as the columns and weights that can be kept as the rows. + +The state `DP[i][j]` will denote maximum value of โ€˜j-weightโ€™ considering all values from โ€˜1 to ithโ€™. So if we consider `โ€˜wiโ€™` (weight in โ€˜ithโ€™ row) we can fill it in all columns which have โ€˜weight values > wiโ€™. Now two possibilities can take place: + +- Fill `โ€˜wiโ€™` in the given column. +- Do not fill โ€˜wiโ€™ in the given column. + +Now we have to take a maximum of these two possibilities, formally if we do not fill `โ€˜ithโ€™` weight in `โ€˜jthโ€™`column then `DP[i][j]` state will be same as `DP[i-1][j]` but if we fill the weight, `DP[i][j]` will be equal to the value of `โ€˜wiโ€™+` value of the column weighing `โ€˜j-wiโ€™` in the previous row. So we take the maximum of these two possibilities to fill the current state. + +## ๐Ÿงฎ Algorithm +Let's visualize the algorithm here, + +``` +Let weight elements = {1, 2, 3} +Let weight values = {10, 15, 40} +Capacity=6 + +0 1 2 3 4 5 6 + +0 0 0 0 0 0 0 0 + +1 0 10 10 10 10 10 10 + +2 0 10 15 25 25 25 25 + +3 0 + +Explanation: +For filling 'weight = 2' we come +across 'j = 3' in which +we take maximum of +(10, 15 + DP[1][3-2]) = 25 + | | +'2' '2 filled' +not filled + +0 1 2 3 4 5 6 + +0 0 0 0 0 0 0 0 + +1 0 10 10 10 10 10 10 + +2 0 10 15 25 25 25 25 + +3 0 10 15 40 50 55 65 + +Explanation: +For filling 'weight=3', +we come across 'j=4' in which +we take maximum of (25, 40 + DP[2][4-3]) += 50 + +For filling 'weight=3' +we come across 'j=5' in which +we take maximum of (25, 40 + DP[2][5-3]) += 55 + +For filling 'weight=3' +we come across 'j=6' in which +we take maximum of (25, 40 + DP[2][6-3]) += 65 +``` + +## โฐ Complexity Analysis: +- **Time Complexity:** `O(N*W)`. [where โ€˜Nโ€™ is the number of weight element and โ€˜Wโ€™ is capacity. As for every weight element we traverse through all weight capacities 1<=w<=W.] +- **Auxiliary Space :** `O(N*W)`. [The use of 2-D array of size `โ€˜N*Wโ€™`.] + +--------------------------------------------------------------- +## ๐Ÿ–‹๏ธ Author +**Code contributed by, _Abhishek Sharma_, 2021 [@abhisheks008](github.com/abhisheks008)** + +[![forthebadge made-with-python](http://ForTheBadge.com/images/badges/made-with-python.svg)](https://www.python.org/) From 58e1defbf717ea4b73d02144f34b2873858841d1 Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Fri, 1 Oct 2021 16:15:41 +0530 Subject: [PATCH 07/11] Add files via upload --- Knapsack/0-1 Knapsack/Images/knapsack1.PNG | Bin 0 -> 10438 bytes Knapsack/0-1 Knapsack/Images/knapsack2.PNG | Bin 0 -> 10569 bytes Knapsack/0-1 Knapsack/Images/knapsack3.jpg | Bin 0 -> 26615 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Knapsack/0-1 Knapsack/Images/knapsack1.PNG create mode 100644 Knapsack/0-1 Knapsack/Images/knapsack2.PNG create mode 100644 Knapsack/0-1 Knapsack/Images/knapsack3.jpg diff --git a/Knapsack/0-1 Knapsack/Images/knapsack1.PNG b/Knapsack/0-1 Knapsack/Images/knapsack1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..f5df83a5ca667179ed9000901199c4c921e6beea GIT binary patch literal 10438 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 literal 0 HcmV?d00001 diff --git a/Knapsack/0-1 Knapsack/Images/knapsack3.jpg b/Knapsack/0-1 Knapsack/Images/knapsack3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67213921563cd9019f897574d45e10df628f9f5b GIT binary patch literal 26615 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 literal 0 HcmV?d00001 From b6d9a519408e0ed5d30890d4a6fbd478f3448f77 Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Fri, 1 Oct 2021 16:17:20 +0530 Subject: [PATCH 08/11] Update README.md --- Knapsack/0-1 Knapsack/Dynamic Method/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Knapsack/0-1 Knapsack/Dynamic Method/README.md b/Knapsack/0-1 Knapsack/Dynamic Method/README.md index 5a5e9fbd..9e691a15 100644 --- a/Knapsack/0-1 Knapsack/Dynamic Method/README.md +++ b/Knapsack/0-1 Knapsack/Dynamic Method/README.md @@ -65,7 +65,10 @@ we take maximum of (25, 40 + DP[2][6-3]) = 65 ``` -## โฐ Complexity Analysis: +## ๐Ÿ’ป Input and Output +![](https://github.com/abhisheks008/PyAlgo-Tree/blob/main/Knapsack/0-1%20Knapsack/Images/knapsack1.PNG) + +## โฐ Complexity Analysis - **Time Complexity:** `O(N*W)`. [where โ€˜Nโ€™ is the number of weight element and โ€˜Wโ€™ is capacity. As for every weight element we traverse through all weight capacities 1<=w<=W.] - **Auxiliary Space :** `O(N*W)`. [The use of 2-D array of size `โ€˜N*Wโ€™`.] From 9dab1d870740a7fbff582a7c165c846c2cd4ce57 Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Fri, 1 Oct 2021 16:17:59 +0530 Subject: [PATCH 09/11] Update README.md --- Knapsack/0-1 Knapsack/Brute Force Method/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Knapsack/0-1 Knapsack/Brute Force Method/README.md b/Knapsack/0-1 Knapsack/Brute Force Method/README.md index 53eec331..5c3c7a29 100644 --- a/Knapsack/0-1 Knapsack/Brute Force Method/README.md +++ b/Knapsack/0-1 Knapsack/Brute Force Method/README.md @@ -38,6 +38,10 @@ Recursion tree for Knapsack capacity 2 units and 3 items of 1 unit weight. ``` +## ๐Ÿ’ป Input and Output +![](https://github.com/abhisheks008/PyAlgo-Tree/blob/main/Knapsack/0-1%20Knapsack/Images/knapsack2.PNG) + + ## โฐ Complexity Analysis: - **Time Complexity:** `O(2^n)`. [As there are redundant subproblems.] - **Auxiliary Space :** `O(1)`. [As no extra data structure has been used for storing values.] From e2c079bfa1ce02d313877133b8ede91dfb407567 Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Fri, 1 Oct 2021 16:36:13 +0530 Subject: [PATCH 10/11] Update README.md --- Knapsack/0-1 Knapsack/README.md | 56 +++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/Knapsack/0-1 Knapsack/README.md b/Knapsack/0-1 Knapsack/README.md index 8b137891..41cb2b23 100644 --- a/Knapsack/0-1 Knapsack/README.md +++ b/Knapsack/0-1 Knapsack/README.md @@ -1 +1,57 @@ +# 0-1 Knapsack Problem +Language used : **Python 3** + +![](https://github.com/abhisheks008/PyAlgo-Tree/blob/main/Knapsack/0-1%20Knapsack/Images/knapsack3.jpg) + +## ๐ŸŽฏ Aim +The aim of this script is to find out the maximum value subset of val[] such that sum of the weights of this subset is smaller than or equal to W. + +## ๐Ÿ‘‰ Purpose +The main purpose of this script is to show the implementation of Brute Force method and Dynamic Programming method to solve the 0-1 Knapsack problem. + +## ๐Ÿ“„ Description +Given weights and values of `n` items, put these items in a knapsack of capacity `W` to get the maximum total value in the knapsack. In other words, given two integer arrays `val[0..n-1]` and `wt[0..n-1]` which represent values and weights associated with `n` items respectively. Also given an integer `W` which represents knapsack capacity, find out the maximum value subset of `val[]` such that sum of the weights of this subset is smaller than or equal to `W`. You cannot break an item, either pick the complete item or donโ€™t pick it `(0-1 property)`. + +## ๐Ÿ“ˆ Workflow of the script +- `knapsack` - This is the main function which will provide us maximum value that can be put in the capacity of W. +- `main` - This is the driver code for this code/script. + +## ๐Ÿงฎ Algorithms and Explanation +Here to solve the 0-1 Knapsack problem, I have used two different types of methods, +- **Brute Force Method** - The brute force approach is a guaranteed way to find the correct solution by listing all the possible candidate solutions for the problem. It is a generic method and not limited to any specific domain of problems. The brute force method is ideal for solving small and simpler problems. + +๐Ÿ”ด **You can find out the approach of Brute Force Method to solve the 0-1 Knapsack problem, [here โœ”๏ธ](https://github.com/abhisheks008/PyAlgo-Tree/tree/main/Knapsack/0-1%20Knapsack/Brute%20Force%20Method)** + + +- **Dynamic Method** - Dynamic programming is a technique that breaks the problems into sub-problems, and saves the result for future purposes so that we do not need to compute the result again. The subproblems are optimized to optimize the overall solution is known as optimal substructure property. The main use of dynamic programming is to solve optimization problems. Here, optimization problems mean that when we are trying to find out the minimum or the maximum solution of a problem. The dynamic programming guarantees to find the optimal solution of a problem if the solution exists. The definition of dynamic programming says that it is a technique for solving a complex problem by first breaking into a collection of simpler subproblems, solving each subproblem just once, and then storing their solutions to avoid repetitive computations. + +๐Ÿ”ด **You can find out the approach of Dynamic Method to solve the 0-1 Knapsack problem, [here โœ”๏ธ](https://github.com/abhisheks008/PyAlgo-Tree/tree/main/Knapsack/0-1%20Knapsack/Dynamic%20Method)** + +## ๐Ÿ’ป Input and Output +``` +The values given : +[60, 100, 120] +----------------------------------------------------- +The corresponding weights are : +[10, 20, 30] +----------------------------------------------------- +The maximum capacity can be : +50 + +----------------------------------------------------- +Output : +Maximum total value of the Knapsack : +220 +``` + +## ๐Ÿ“Š Comparison of two different methods +We have implemented both the algorithms and methods and also have checked the time and space complexities of them. The **Brute force method** is having the time complexity of `O(2^n)` and the **Dynamic Method** is having the time complexity of `O(N*W)`. From this, it is clearly visible that using **Dynamic Method** provides less time complexity which means that the program can be run smoothly with less time spent. + +Hence, **Dynamic Method โœ”๏ธ** is having the upper hand in between these two types of methods of solving! + +--------------------------------------------------------------- +## ๐Ÿ–‹๏ธ Author +**Code contributed by, _Abhishek Sharma_, 2021 [@abhisheks008](github.com/abhisheks008)** + +[![forthebadge made-with-python](http://ForTheBadge.com/images/badges/made-with-python.svg)](https://www.python.org/) From d1ae323bfb19f1d658786ef5e97b9595aabeb519 Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Fri, 1 Oct 2021 16:36:52 +0530 Subject: [PATCH 11/11] Delete README.md --- Knapsack/0-1 Knapsack/Images/README.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Knapsack/0-1 Knapsack/Images/README.md diff --git a/Knapsack/0-1 Knapsack/Images/README.md b/Knapsack/0-1 Knapsack/Images/README.md deleted file mode 100644 index 8b137891..00000000 --- a/Knapsack/0-1 Knapsack/Images/README.md +++ /dev/null @@ -1 +0,0 @@ -