From 98d8c7c202ad31f3fcd6073485c0075c640ba68f Mon Sep 17 00:00:00 2001 From: Neeraj Pratap Hazarika <72177954+NeerajHazarika@users.noreply.github.com> Date: Sat, 2 Oct 2021 00:55:18 +0530 Subject: [PATCH 1/7] [new] created README.md - new readme.md in PyAlgo-Tree/Dynamic Programming/0 1 Knapsack/ --- Dynamic Programming/0 1 Knapsack/README.md | 51 ++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Dynamic Programming/0 1 Knapsack/README.md diff --git a/Dynamic Programming/0 1 Knapsack/README.md b/Dynamic Programming/0 1 Knapsack/README.md new file mode 100644 index 00000000..3c31a7ba --- /dev/null +++ b/Dynamic Programming/0 1 Knapsack/README.md @@ -0,0 +1,51 @@ +# 0/1 Knapsack +Language used : **Python3** + +## 🎯 Aim +To maximize profit/value in 0/1 Knapsack Problem + +## 🌟 Purpose +To show the implementation of Top Down Dynamic Programming approach to solve 0/1 Knapsack Problem. + +## 📄 Description +The knapsack problem is a problem in combinatorial optimization: Given a set of items, each with a weight and a value, take items to include in a knapsack such that the total weight is less than or equal to a given limit and the total value is as large as possible. Print the total value. + +Example: +``` +Input : +val = [60, 100, 120 ] +wt = [10, 20, 30 ] +W = 50 + +Output : +220 +``` + +## Explanation +A basic brute-force solution could be to try all combinations of the given items (as we did above), allowing us to choose the one with maximum profit and a weight that doesn’t exceed ‘W.’ Take the example of 3 items (A, B, C, and D), as shown in the diagram below. To try all the combinations, our algorithm will look like: +``` +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[] = {10, 20, 30}, W = 50, val[] = {10, 20, 30} + + K(n, W) + K(3, 50) + / \ + / \ + K(2, 40) K(2, 50) + / \ / \ + / \ / \ + K(1, 20) K(1, 40) K(1, 1) K(1, 0) + / \ / \ / \ + / \ / \ / \ +K(0, -10) 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. +``` + +## Author +Neeraj Pratap Hazarika [@NeerajHazarika](https://github.com/NeerajHazarika) + +[![forthebadge made-with-python](http://ForTheBadge.com/images/badges/made-with-python.svg)](https://www.python.org/) From 63427344d3e269e69609dd7f40473084a2ccb2b8 Mon Sep 17 00:00:00 2001 From: Neeraj Pratap Hazarika <72177954+NeerajHazarika@users.noreply.github.com> Date: Sat, 2 Oct 2021 13:10:34 +0530 Subject: [PATCH 2/7] [update] readme --- Dynamic Programming/0 1 Knapsack/README.md | 145 ++++++++++++++++++--- 1 file changed, 124 insertions(+), 21 deletions(-) diff --git a/Dynamic Programming/0 1 Knapsack/README.md b/Dynamic Programming/0 1 Knapsack/README.md index 3c31a7ba..8590087f 100644 --- a/Dynamic Programming/0 1 Knapsack/README.md +++ b/Dynamic Programming/0 1 Knapsack/README.md @@ -21,29 +21,132 @@ Output : 220 ``` -## Explanation -A basic brute-force solution could be to try all combinations of the given items (as we did above), allowing us to choose the one with maximum profit and a weight that doesn’t exceed ‘W.’ Take the example of 3 items (A, B, C, and D), as shown in the diagram below. To try all the combinations, our algorithm will look like: +## 🧮 Explanation +A basic brute-force solution could be to try all combinations of the given items, allowing us to choose the one with maximum profit and a weight that doesn’t exceed ‘W.’ Take the example of 3 items, as shown in the diagram below. To try all the combinations, our algorithm will look like: + +
+ +

+ +We can optimize this algorithm further with a 2D matrix. We can overcome the problem of calculating redundant cases and thus increased complexity. We can solve this problem by simply creating a 2-D array that can store a particular state (n, w) if we get it the first time. Now if we come across the same state (n, w) again instead of calculating it in exponential complexity we can directly return its result stored in the table in constant time. This method gives an edge over the recursive approach in this aspect. + ``` -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[] = {10, 20, 30}, W = 50, val[] = {10, 20, 30} - - K(n, W) - K(3, 50) - / \ - / \ - K(2, 40) K(2, 50) - / \ / \ - / \ / \ - K(1, 20) K(1, 40) K(1, 1) K(1, 0) - / \ / \ / \ - / \ / \ / \ -K(0, -10) 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. +Let weight elements = {1, 2, 3} +Let weight values = {10, 15, 40} +Capacity=6 + +We intialize a 2D MATRIX called DP with 0 to 3(no of items) rows and 0 to 6(max capacities possible) +Each cell of this DP will represent max profit by selecting certain combination of items(through recursion) +which is below or equal to max capacity of it's column, We initialize all cell values as -1. + +Since we know our 2d dp matrix will be as shown below irrespective of the values of weights as +not taking any element or max capacity=0 will give max profit = 0 so 0th row and 0th column are +0, consider -1 to be null values: + 0 1 2 3 4 5 6 (max capacities) + - - - - - - - +0 | 0 0 0 0 0 0 0 + +1 | 0 + +2 | 0 + +3 | 0 +(item no.) + +Filling 1st row: +For filling 'weight(i) = 1' we come across 'j = 1 to 6' in which we take maximum of : +max(0, 0 + DP[1-1][j-1]) = 25, from j = 1 to 6, where 0=DP[i-1][j] in 1 not taken. + | | + '1' '1 taken' + not taken + + 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 + +3 | 0 + +Filling 2nd row: +For filling 'weight(i) = 2' at 'j = 1' we take maximum of : +max(10, 15 + DP[2-1][1-2]) = 10, where 10 = DP[i-1][j] and since for "15 + DP[2-1][1-2]" we will reach max weight limit + | | so it cannot be taken, that why DP[2-1][1-2] is undefined and also not accessed + '2' '2 taken' + not taken + +For filling 'weight(i) = 2' at 'j = 2' we take maximum of : +max(10, 15 + DP[2-1][2-2]) = 15, where 10 = DP[i-1][j] + | | + '2' '2 taken' + not taken + +For filling 'weight(i) = 2' at 'j = 3 to 6' we take maximum of : +max(10, 15 + DP[2-1][j-2]) = 25, where 10 = DP[i-1][j], and since all DP[1][1] to DP[1][6] has value 10, so 15+10=25 + | | + '2' '2 taken' + not taken + + 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 + +Filling 3rd row: +For filling 'weight(i) = 3' at 'j = 1' we take maximum of : +max(10, 40 + DP[3-1][1-3]) = 15, where 10 = DP[i-1][j], and since DP[3-1][1-3] isnt valid we take 10 as max + | | + '3' '3 taken' + not taken + +For filling 'weight(i) = 3' at 'j = 2' we take maximum of : +max(15, 40 + DP[3-1][2-3]) = 15, where 10 = DP[i-1][j], and since DP[3-1][2-3] isnt valid we take 15 as max + | | + '3' '3 taken' + not taken + +For filling 'weight(i) = 3' at 'j = 3' we take maximum of : +max(25, 40 + DP[3-1][3-3]) = 15, where 10 = DP[i-1][j], and since DP[3-1][3-3] is valid we take 40+0 as max + | | + '3' '3 taken' + not taken + +similarly, when we reach 'weight(i) = 3' at 'j = 6' we take maximum of : +max(25, 40 + DP[3-1][3-3]) = 15, where 10 = DP[i-1][j], and since DP[6-1][6-3] is valid we take 40+25 as max + | | + '3' '3 taken' + not taken +We have reached our solution for max profit (with max weight capacity = 6) at DP[3][6] (the last cell of our 2d matrix) + + 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 ``` +## 💻 Input and Output +- **Test Case 1 :** + +![io 1](https://user-images.githubusercontent.com/72177954/135707806-ee72b296-541a-462a-ab9f-d3e4fabc31b8.png) + +- **Test Case 2 :** + +![io 2](https://user-images.githubusercontent.com/72177954/135707940-3e153cc4-d1cd-4bc2-b518-f8a1bb294ed3.png) + +## ⏰ Time and Space complexity +- **Time Complexity:** `O(N*W)`. +- **Space Complexity:** `O(N*W)`. ## Author Neeraj Pratap Hazarika [@NeerajHazarika](https://github.com/NeerajHazarika) From 283f464dcdebfa1e8a86a05598e84c78158964e6 Mon Sep 17 00:00:00 2001 From: Neeraj Pratap Hazarika <72177954+NeerajHazarika@users.noreply.github.com> Date: Sat, 2 Oct 2021 13:12:47 +0530 Subject: [PATCH 3/7] [new] added Images folder --- .../0 1 Knapsack/Images/io_1.png | Bin 0 -> 7088 bytes .../0 1 Knapsack/Images/io_2.png | Bin 0 -> 6979 bytes .../0 1 Knapsack/Images/tree_dig.jpg | Bin 0 -> 23679 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Dynamic Programming/0 1 Knapsack/Images/io_1.png create mode 100644 Dynamic Programming/0 1 Knapsack/Images/io_2.png create mode 100644 Dynamic Programming/0 1 Knapsack/Images/tree_dig.jpg diff --git a/Dynamic Programming/0 1 Knapsack/Images/io_1.png b/Dynamic Programming/0 1 Knapsack/Images/io_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c0ef114d31e6116b32c396731e6df03a658d20d5 GIT binary patch literal 7088 zcmaiY2UJtb{&hm{AU*V6q)C;gNN-X^kPadclrAk0LJ_1_0SV<2x*!Nas+0hV)P#-# zDgo(52)#)A$9v!V-dEOJU)DNF&Y81*vuDnkJ$vs2Q)69f3N{J=06?v;r)35J05|ae zlgSA1-_whI1^6GJznQKEpmv1gPYaQox{*2n@IH<5!igAvPVTE`?GFIZ2mCpJSTJ`m z0Kl%TucdAt?66(n0p$?Oh+T7YOl_Z*mW@EM;I!EH3>woM%o$jC@Sg^=@}d2cy9f7$ z>ELORR9jXz&myj_Mk89TPmo>LOO6re{b|>iUDwx?06@3lelrSxUdUZ|eKv}7R1SBt zTE9~UrAdfbErw}JCZ3+{9rV+3&L^_4MEvduzxZu*+mvi>a90$9QxbX%W+@=kR0i`J3A@jn$T@4HcBiGesD7 z&Eb>3>h>36+9>R0O2>!Omi4)%N1`dVI~4;RWnra|=(QLBG(fiJ99TgP&*_9iTgVIu ztXML?Oy$P1XR5+Gz3La3zlc3}ZAC+hgn=5(On|G20Qfi}yfh5lzT6xS6Fz|iw&&hB-29D5#ZKM z7~h%=RG#9y85JROGPib?zR~Juv^(b3<0m4{tw>(<0o&?LMhK_dH#Qn7uwI*hdcTNK5G2@BgvFk7C+p`70K}!)#FrKmF{z|;#Rt}=1Mso zzY`vE+LT~_cdb8;q%1f?Z^HZ6 z?HfdY4OX7BSvcz)(Z8y(l|ZEq{{x@Xr@@>QAAjJTVoaJPY^6^Hk5 z7Mme;6tyz_8(SG-v+E2}wyB=I>`Qimqweikr*x0XTiMd31F|m!m%FQxBq^D3v17Bz zI={C2TRWZ)2I@Jz@SM#;wF!rrPCh8^KzR3&j0@68RBLyn+wSgu|to00L>=ZOeB~m{369HAC!ic|!yj&AZvxt^TZOa#z$xIID5MH9U zN_-<}*6>$Jfc->Hf9H-u%=)IxR7J$&E73eN92u47&Sxb27q!?F}vCivE%gPWSJ;wvDz(nhv z>d^`rsMJ^Om%bQB3GfiLS#8JKP)-4;zyDYd3-LmvP(%DoGMf4kwQh2;Z^5=dG0oOOUg(81d zajiM^nL|EkO_E|Vb$g5r#;E{j(Q&>@##y+6hMts}{nEJ+=$W%(BZFZQqjJG42psKX zj+I!w*$=79%M+_E6%3I)(cd+TwtLnzGUzwL6go_|HA+-H0Sw)`m3)g12c`(uKir6< zdirFYefKZQbROh!mY_zuA>0ND77b<61lhPm*E158Svb7wkqeryzCZd1h7n)5>ZEUU zkJWr4m5PK+JStt7V{q5?p&%WgfTV{(tQFq7Gn_%|gI~ASUSurIS5MizOVhnC6DT|! zz!&Q$^k+PE$t|%Zz{~YXptAzJ$Y@<7{={Z=^Qc88Hr=rHz7nx9^Gf}< zjN2)}Z?!~bGB>|wluBX5gJ*c0GiBCWf7JB7aFyg%I3TK9y}rhIOkEb%4X zYfN~;29ivY_-Q;0u{!hyr1IgCP={wV9jil~)Sb4#I$G%M53KX;2SiW^A@p`I(V@5R zogLi$u@9t0kZ9d|I1)hQ`3o#H0B}NxVg~?rNTIg@fFHE@Qh*QK>vPmnr!^7GWu8~@ zjcpe|weDTa0W_bRQt5eVH)Z|$Tr};#cv@)9sLK37{#>$Us9Nh)Ttv6AgYh}T*H1|t zLoqUA?P-2HI$GL8D zxXq4gUttP834G$PY$}=c0vnd);WO1zcV-L4A~I37JI{YNq#^y!aI7-bvefc=2Zd^@ zY~!lLZ_(%_a+lNFM$H*qa<7)(j+E5}pGAI(S&YdO`RQ`!jmujJ zbNR}tGms(Zxx8w{s7JzHY5X&At{5G+II%nj_t3=%?jEl_=V6giXPM@-(BcRhl*`Cp5dP=2V1&fEA-+_aywA zL}M;%Dnj%z6Z|ULi_zspv7U;%RWboH13A1v=n&UImB{-jx5Y1l+B`{D-r}$Bh`Z8` zQ#X{U<>KGlMwS8dbgF}t`&3fp!Lx+uM=;sLCzXcHDR@-HhB{{ULkY<(;%`{$X)7PB z+n4tn_Ij9cdZhOmiU-uC%(tgkuv>iWjM5O4MFwRiB(qu1B;a)b0T_H2F0xww_B7bB z;f_w64E%l1SdOdtE2R*D&JV0gsJ$jVo!I(~U)&gHM@YUQPptCT5{}l4wnKMm)Q^}* zrbH0Bh|bo|_EJq1X>(s7ShK?KO@u+9rbX6vZmCe6d-8Jag!p)CS{!&K3d8lSd?X}PPT*G9+3Prp_ z#p47--}Ff6m)GcCH;}TiZ0%Ee3)1hW_GEX%`DQF1tW%aV3$l#=5_~M~T*`)+T$6Wx z)b`RbgJ^@7uB$=H@!!3`OEwf68j#Ae(=a8$*3@e~#EFl3E5QEKwiQuIU0+DSIB(0UPFkM%d z6uTN7_rQ$PQ`Oguzmm9`cls<%Gqz6CmeJ7Lq2E9+=K4rg(M)vcO1J^09~a|NWVi)@7#+k);O_sndEv+@ z6!Fv4jmSV28Y)O3|L^@k)}C=IlQmO)MKO8>c%@MB%|yZ6|v^9f@e8d z)0j~!5>F}xiolQ+%DyzdH@U90_h5C5Q@$d1gE@nW(ran5;-jWu`f;^JpR1FC&E>aL zc;Z9$C#8eExHjkfr2jC@)Pc$hhta)DFR$a(XL>fnz^~KZIn_7ISnfp(T0dYN$SJ<6 z;UdrE$_5(3$EBT5atZ`A1nx>p;9SB7G4CIIu&gXTUF<;Z5y%OLudq>immHsnC#MAQa1_UEqEE4dM&MxcmIuo++s$NG%z$5FOPCF* z`JHC1?PTf_Lk^oqkfHnqwv7DL77$5R=VM{WV(6YyP)!a-cqk)P7=ww@AYNPw8$M=@ zcSKlX{tx1i4rb>%Z~JbiC_VMUq3LR3ePwg}w873$sPzqnGe|a3HC0TCClhX_E7;Fzesu_#os2#qCNH&4gd0gZ4&TZiYSKSbN_kXms@mQ zs>qyTX*YIru$yC`knV$ryE-sU9Ad8QUvhCxQm((0Woa5Wn&!w|xG$1;n*e%;98r}; zwl-vI3MmO0B#Z@y*e)p)FWqo})lBLXtM*Kgs}~dOshsc2Q++1=!$|+(3aXuv%uoo< zHFw3PKDSx~KUWLWJSf(wwg@w#@N7$0{-Tywxj#dh;#u~g=GB_tIYjCag9C zv@&8QQuj&l&~Z3)AMHP-O$3S0OGqUHn$>aP&YkZd4HX49X1rjz;MQy^|6U40kgULh zThw*mLsIKqnWE_>H;M|hhbXc>RTB&h%s%-5s$(eBwE=N``6)zS)_33ef<40+7B23W zdgMJjS4Xoz{AcNRva7%??#mo8D@-Q*VzT=xcz4?D=Y1UjOZ0IeLZ07J^N}0y94}+` zR$P&jE8BjYP}(>k!=oi|x3NxQIpzJ9Z`&TRjm7sR7phEOoX(or^%S2L98j>b^&@*s zRohKn>p2d0AmH)#kJG$TIbjw5NMQcNI(GS_V82TYbIn+wmp)`1ieg$4qiI2vrar0O0UfKlCK-ST|2; z22?&Tc@tAM(%+SpA6x!hn2XA4!1(6b-k;{EzqaSR zWBY!{1**n{K3&QW7APt|-bwn?AEjSCM7WF??Wn$dl$m0y$TIeXKcL4Sh^J0@>qGC2 zMu{UNXX6c76|V=^RK5Xok7j-~)O=c=3N9e~GZ~{_r|0l_gagID_1}Mp_rE=l{_n>- zKi$;3h|kZ8EXNM|HP*(yI;!0~mWKE=k=yR&I zRGCsc%RrGeU<&ipx)vsSXDkQZBZlkJmzw7830!S>!eI=HJK7%rR* z-bK^$;lKodVn>~$)$td{+UIExcY08^2H98bv0^>TU50P*nsDG3F5=mroWQj=+HS=Z zrQsyxO!EC98D4bI6ufbniGL2f6g-g4Di+f#rk)WmZ`xL~OL1&~=LQ?dDP=tt9T)jQ z$NfXZsnU1j%c@K&LkK$3zC+7qy6HyBFM~VveMJ&e={%2HAIR?M(rS}+#HP2(^6Oh; z8c&@{ba;C9-q_a4QU`i`%yt&=gYB3s6k{c9S9xb=hnF*ybs0>rFXv%;|{d{x;k6%E9TXhsn>KbwI4N8pA5mf+&&*4tKw>%Pv6gTjbhHiC8vUB$e3Gq znxP8ez9J3f{)tp^M9Jr!2f&y*7OCF*3XQt=g=%@%zs)0l0uEeJ^^lRUK zveJn(`aC*3d!lZ%`EuIdrdXMtRML?g`|)j_;;=%mmwE2&gwkI0Zx^Q*pDJU)EE?7~ zsWL_gg$%wOinllJ5q9Kg)k$%Vf=K^LQVSJ%HBA-7$4)+^tCzMS&S`Y7E9s?i>kz3e z^FCB6xOs(rj~exT`oSOLIw)_!ijEgm7g2WXQ#Rop9xF2rzC(LcHQ)?ZOHkpCj|TF{ zXlQQf64fs55H{BQ0P*>j{cM!fwQ6f@~|1VSG`EdJcUx2L^|!nUMt<091dXJ6#)b0X41QU1aH^ zm*`7Io9vgxpH8#9FpMcA3?M2dmm6b=bjhyw+q-O9es%`!0-g5~!ly&t=Hpy29R$G- z%|{R4DYv%Ow~0m%stdh#^j4C72ZL{!uJoRyqb=*!=K!jt*Yurid}E#Ot?QcwcD0N4 zHOJaN8v6GCz4di5n}?I(eL1;97ex3+L~H4DHF9%o^nW+x{~=`0BkyxU<>R%V+Z~r1 zXu*r6$I;wmlmre4^wrpd6V0m%e;}aS-|EDB$N9IqS(2RM2J|X!&CLbvcoi2C9SL76 z2@dHa!Ns1p;w5;lIP~`I`l?`3n**_K=OIIBIw2X|wPhd$@_&%#kH|Ek-2mq05bVuGBc3lzr*H1pcg>E~Hr@pyN z4VQ4=hDt|c@6h6lrDjATxY797d(>&Jz4iHXDOsbsLq&ub?b`V>y4`&{&JKNwd;~Y< z?>pAEcD^;cdt}DZa!yP*U&`UpNK*E$evpCP`U5B~5GNTX@k+Rn+rVQx+l5tjeeM81 zvYUDf;OKwBIoavl+6X>u;Feo8u3k!4$00~NRN>u5t%VW)l&FMMxSm_Mow$BD?3^0d zuvWo(N3$PK@+`2dYzoEb`u#nNhdV?qQsr{q>MA@9vkS?(>errnL_jG_`P`2OpAZ9o zu)56Qg$$sB4gbvlms|O7o8~_$OB!xt?)PlYct0C1^>QZd(r%R92L#xKm0)YQ)t1xv z5}RPy-Muun>~7_7mQ%vqBj=Lr*=)yU=aXaE%7UE7gW-UqOJjyeOK>S<4J^<#DzLYm zvg$fmbAB((p%{|+>w=reZ$R6m&Lys%ve5^C(3xqUL=SeMZRSTEyH@76FR?lYLo>!L zgGsPC`<%;fy)W(e!Hp-;5#B(6al_7>+T`_`WtPo}3Dg-4x4ifb-uDofl5gP;OL5ic zSWc4f?KqRS)HtZ?U59jMFwqi9z31QqR)_FW*C+MKX?Qu;NRspGi+mDqkhooZlX8#v zxrsp_>_$7vmfL?kAk$ni7YKlfvZL~^)=rRzwG*?l70r0$;`){6SdNlj>a?0iOTCP;Vz3R>t&KGuJG$O#uC&|PoGS-d$K(YZ`p_-p+?KgJd2oO z35oI79|**8K@(Q!JS1fE?&bNViW+*N-$=@sjNxsJBZM-XMFUZ*-pPUuYj_)Fe=`($ z6!Ja=u#5FP+Sv~mBK?jybya9g5kP`|)qCa+&xdj)pp&ni>) zPMZ9gNpW}Jw#M&}Ol5@tLmTRg9s~f!V2iT#%ALR$sl8K+q5M`A|A0Fn>!LH=6{3N>|pb{B%#BnETjv0hQcK3-6N;Af*PJ@|9rk{L*T5+^f!?w+LxZdf%}FhhbiO-{Ztl4D_Q=MFGWk1mfRv`)hc@3A&}4(mQYP&bCFG)AbUWOt`R^m!b=~^ zmThRZX%=Bk0D#F?KyO0~L+oSZ)cF;TeL@jMEZ-HG6zvl7+atF>DdeK%kMhR#+}?%J z+)BNdl$&McCc9V_eZMf7XSnSz83pFaDbB@Zd5&I7&4nk%@Tuvnp09L(-7i`wTO(}h y#6}<$008;lqslb3_kWzi-2a;)^f^XcvJB&X_?-9^TH;kLKwsNft5)N2)c*ilP@m}l literal 0 HcmV?d00001 diff --git a/Dynamic Programming/0 1 Knapsack/Images/io_2.png b/Dynamic Programming/0 1 Knapsack/Images/io_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e52392b4a92965e63ac6481dd771098042c98234 GIT binary patch literal 6979 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 I>a)oI0Vd{$VE_OC literal 0 HcmV?d00001 diff --git a/Dynamic Programming/0 1 Knapsack/Images/tree_dig.jpg b/Dynamic Programming/0 1 Knapsack/Images/tree_dig.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb582e4b6e7293045284f8ef997ceac7e6acb408 GIT binary patch literal 23679 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 literal 0 HcmV?d00001 From a0b55ed22cedadc82b98ef9775b49a4cbb1bf950 Mon Sep 17 00:00:00 2001 From: Neeraj Pratap Hazarika <72177954+NeerajHazarika@users.noreply.github.com> Date: Sat, 2 Oct 2021 13:13:22 +0530 Subject: [PATCH 4/7] [new] added 0/1 knapsack python code --- .../0 1 Knapsack/01_knapsack.py | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 Dynamic Programming/0 1 Knapsack/01_knapsack.py diff --git a/Dynamic Programming/0 1 Knapsack/01_knapsack.py b/Dynamic Programming/0 1 Knapsack/01_knapsack.py new file mode 100644 index 00000000..3e4e17c2 --- /dev/null +++ b/Dynamic Programming/0 1 Knapsack/01_knapsack.py @@ -0,0 +1,54 @@ +# This is the memoization approach of 0 / 1 Knapsack in Python in simple +# Method : Dynamic Programming +# Author : Neeraj Pratap Hazarika + +# Problem Statement : Given a set of items, each with a weight and a value, take items to include in a knapsack such that the total weight is less than or equal to a given limit and the total value is as large as possible. Print the total value. + +# ------------------------------------------------------------ + +# declare universal scope 2d matrix, dp +dp=[[]] + +def knapsack(wt, val, W, n): + + # base conditions + if n == 0 or W == 0: + return 0 + if dp[n][W] != -1: + return dp[n][W] + + # choice diagram code + if wt[n-1] <= W: + dp[n][W] = max(val[n-1] + knapsack(wt, val, W-wt[n-1], n-1), knapsack(wt, val, W, n-1)) + return dp[n][W] + elif wt[n-1] > W: + dp[n][W] = knapsack(wt, val, W, n-1) + return dp[n][W] + +# Driver code +if __name__ == '__main__': + # Inputs + W = int(input("Enter the maximum weight the knapsack can hold : ")) + n = int(input("Enter number of items to be choosen from : ")) + print("Enter the weights to be choosen from : ") + wt = list(map(int,input().strip().split()))[:n] + print("Enter the values corresponding to these weights : ") + val = list(map(int,input().strip().split()))[:n] + + # Initialize 2d matrix, dp + dp = [[-1 for i in range(W + 1)] for j in range(n + 1)] + + print("Maximum profit : ",knapsack(wt, val, W, n)) + +# ------------------------------------------------------------ + +# Inputs given : +# Enter the maximum weight the knapsack can hold : 50 +# Enter number of items to be choosen from : 3 +# Enter the weights to be choosen from : +# 10 20 30 +# Enter the values corresponding to these weights : +# 60 100 120 + +# Output : +# Maximum profit : 220 \ No newline at end of file From 0ede0006728bb3bc32913f7779ad88bcadc2e52b Mon Sep 17 00:00:00 2001 From: Neeraj Pratap Hazarika <72177954+NeerajHazarika@users.noreply.github.com> Date: Sat, 2 Oct 2021 13:15:48 +0530 Subject: [PATCH 5/7] [updated] readme updated readme at ./Dynamic Programming/0 1 Knapsack/ --- Dynamic Programming/0 1 Knapsack/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dynamic Programming/0 1 Knapsack/README.md b/Dynamic Programming/0 1 Knapsack/README.md index 8590087f..73ea6f36 100644 --- a/Dynamic Programming/0 1 Knapsack/README.md +++ b/Dynamic Programming/0 1 Knapsack/README.md @@ -25,7 +25,7 @@ Output : A basic brute-force solution could be to try all combinations of the given items, allowing us to choose the one with maximum profit and a weight that doesn’t exceed ‘W.’ Take the example of 3 items, as shown in the diagram below. To try all the combinations, our algorithm will look like:
- +

We can optimize this algorithm further with a 2D matrix. We can overcome the problem of calculating redundant cases and thus increased complexity. We can solve this problem by simply creating a 2-D array that can store a particular state (n, w) if we get it the first time. Now if we come across the same state (n, w) again instead of calculating it in exponential complexity we can directly return its result stored in the table in constant time. This method gives an edge over the recursive approach in this aspect. @@ -138,11 +138,11 @@ We have reached our solution for max profit (with max weight capacity = 6) at DP ## 💻 Input and Output - **Test Case 1 :** -![io 1](https://user-images.githubusercontent.com/72177954/135707806-ee72b296-541a-462a-ab9f-d3e4fabc31b8.png) +![io 1](./Images/io_1.png) - **Test Case 2 :** -![io 2](https://user-images.githubusercontent.com/72177954/135707940-3e153cc4-d1cd-4bc2-b518-f8a1bb294ed3.png) +![io 2](./Images/io_2.png) ## ⏰ Time and Space complexity - **Time Complexity:** `O(N*W)`. From 3e45b28c7d5d845bea7429efe727f9c45829e94e Mon Sep 17 00:00:00 2001 From: Neeraj Pratap Hazarika <72177954+NeerajHazarika@users.noreply.github.com> Date: Sat, 2 Oct 2021 13:20:16 +0530 Subject: [PATCH 6/7] [new] added new pic new pic added at ./Dynamic Programming/0 1 Knapsack/Images --- .../0 1 Knapsack/Images/knapsack_cover_pic.jpg | Bin 0 -> 26615 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Dynamic Programming/0 1 Knapsack/Images/knapsack_cover_pic.jpg diff --git a/Dynamic Programming/0 1 Knapsack/Images/knapsack_cover_pic.jpg b/Dynamic Programming/0 1 Knapsack/Images/knapsack_cover_pic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67213921563cd9019f897574d45e10df628f9f5b GIT binary patch literal 26615 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 literal 0 HcmV?d00001 From bab002714fe1e19a7161cd88aa51250260a01b92 Mon Sep 17 00:00:00 2001 From: Neeraj Pratap Hazarika <72177954+NeerajHazarika@users.noreply.github.com> Date: Sat, 2 Oct 2021 13:22:26 +0530 Subject: [PATCH 7/7] Update README.md --- Dynamic Programming/0 1 Knapsack/README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Dynamic Programming/0 1 Knapsack/README.md b/Dynamic Programming/0 1 Knapsack/README.md index 73ea6f36..0ea0999f 100644 --- a/Dynamic Programming/0 1 Knapsack/README.md +++ b/Dynamic Programming/0 1 Knapsack/README.md @@ -1,5 +1,9 @@ -# 0/1 Knapsack -Language used : **Python3** +

0/1 Knapsack

+ +

+ +Language used : **Python3**
+Source code : [python file](https://github.com/NeerajHazarika/PyAlgo-Tree/blob/main/Dynamic%20Programming/0%201%20Knapsack/01_knapsack.py) ## 🎯 Aim To maximize profit/value in 0/1 Knapsack Problem