Būtinos sąlygos: Įvadas į kuprinės problemą, jos tipus ir jų sprendimo būdus
Duota N daiktai, kuriuose kiekviena prekė turi tam tikrą svorį ir su ja susijusią pelną, taip pat suteikiamas maišelis su talpa IN , [t.y. į maišelį telpa daugiausia IN svoris jame]. Užduotis yra sudėti daiktus į maišą taip, kad su jais susieto pelno suma būtų maksimali.
Pastaba: Apribojimas čia yra tas, kad mes galime arba visiškai įdėti daiktą į maišelį, arba negalime jo įdėti [Neįmanoma įdėti daikto dalies į maišelį].
Pavyzdžiai:
Rekomenduojama praktika 0–1 kuprinės problema Išbandykite!Įvestis: N = 3, W = 4, pelnas[] = {1, 2, 3}, svoris[] = {4, 5, 1}
Išvestis: 3
Paaiškinimas: Yra dvi prekės, kurių svoris yra mažesnis arba lygus 4. Jei pasirenkame prekę, kurios svoris yra 4, galimas pelnas yra 1. O jei pasirenkame prekę, kurios svoris yra 1, galimas pelnas yra 3. Taigi didžiausias galimas pelnas yra 3. Atminkite, kad negalime sudėti 4 ir 1 svorio daiktų, nes maišelio talpa yra 4.Įvestis: N = 3, W = 3, pelnas[] = {1, 2, 3}, svoris[] = {4, 5, 6}
Išvestis: 0
Rekursijos metodas 0/1 kuprinės problemai spręsti:
Norėdami išspręsti problemą, vadovaukitės toliau pateikta idėja:
Paprastas sprendimas yra atsižvelgti į visus elementų pogrupius ir apskaičiuoti bendrą visų pogrupių svorį ir pelną. Apsvarstykite vienintelius poaibius, kurių bendras svoris yra mažesnis nei W. Iš visų tokių poaibių pasirinkite didžiausią pelną turintį poaibį.
hrithik roshanOptimali pagrindo konstrukcija : Norint atsižvelgti į visus elementų pogrupius, kiekvienam elementui gali būti skirti du atvejai.
- 1 atvejis: Elementas įtrauktas į optimalų poaibį.
- 2 atvejis: Prekė neįeina į optimalų komplektą.
Norėdami išspręsti problemą, atlikite toliau nurodytus veiksmus.
Didžiausia vertė, gauta iš „N“ elementų, yra didžiausia iš šių dviejų verčių.
- 1 atvejis (įskaitant Nthprekė): N vertėthelementas plius didžiausia vertė, gauta iš likusių N-1 elementų ir likusio svorio, t. y. (W svoris Nthelementas).
- 2 atvejis (išskyrus Nthprekė): didžiausia vertė, gauta pagal N-1 elementus ir W svorį.
- Jei „Nth' elementas yra didesnis nei 'W', tada N-asis elementas negali būti įtrauktas ir 2 atvejis yra vienintelė galimybė.
Žemiau pateikiamas pirmiau minėto metodo įgyvendinimas:
C++ /* A Naive recursive implementation of 0-1 Knapsack problem */ #include using namespace std; // A utility function that returns // maximum of two integers int max(int a, int b) { return (a>b)? a : b; } // Grąžina didžiausią reikšmę, kurią // galima įdėti į W talpos kuprinę int knapSack(int W, int wt[], int val[], int n) // Pagrindinis atvejis, jei (n == 0 // Vairuotojo kodas int main() { int pelnas[] = { 60, 100, 120 } = { 10, 20, 30 } int W = 50 int n = dydis(pelnas) / dydis[; 0]);<< knapSack(W, weight, profit, n); return 0; } // This code is contributed by rathbhupendra> C /* A Naive recursive implementation of 0-1 Knapsack problem */ #include // A utility function that returns // maximum of two integers int max(int a, int b) { return (a>b)? a : b; } // Grąžina didžiausią reikšmę, kurią // galima įdėti į W talpos kuprinę int knapSack(int W, int wt[], int val[], int n) W == 0) return 0; // Jei n-osios prekės svoris yra didesnis nei // Kuprinės talpa W, tai šis elementas // negali būti įtrauktas į optimalų sprendimą, jei (wt[n - 1]> W) return knapSack(W, wt, val, n - 1); // Grąžinti daugiausiai du atvejus: // (1) n-asis elementas įtrauktas // (2) neįtrauktas kitur return max( val[n - 1] + knapSack(W - wt[n - 1], wt, val, n - 1), knapSack(W, wt, val, n - 1)); // Tvarkyklės kodas int main() { int pelnas[] = { 60, 100, 120 }; vidinis svoris[] = {10, 20, 30}; int W = 50; int n =(pelno) dydis /(pelno[0] dydis); printf('%d', knapSack(W, svoris, pelnas, n)); grąžinti 0; }> Java /* A Naive recursive implementation of 0-1 Knapsack problem */ class Knapsack { // A utility function that returns // maximum of two integers static int max(int a, int b) { return (a>b)? a : b; } // Grąžina didžiausią reikšmę, kurią // galima įdėti į // talpos W kuprinę static int knapSack(int W, int wt[], int val[], int n) // Tvarkyklės kodas public static void main( Eilutės args[]) { int pelnas[] = naujas int[] { 60, 100, 120 }; int svoris[] = naujas int[] { 10, 20, 30 }; int W = 50; int n = pelnas.ilgis; System.out.println(knapSack(W, svoris, pelnas, n)); } } /*Šį kodą sukūrė Rajat Mishra */> Python # A naive recursive implementation # of 0-1 Knapsack Problem # Returns the maximum value that # can be put in a knapsack of # capacity 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) # grąžinti daugiausiai dviem atvejais: # (1) n-oji prekė įtraukta # (2) neįtraukta kita: return max( val[n-1] + knapSack ( W-wt[n-1], wt, val, n-1), knapSack(W, wt, val, n-1)) # funkcijos pabaiga knapSack # Vairuotojo kodas, jei __name__ == '__main__': pelnas = [60, 100, 120] svoris = [10, 20, 30] W = 50 n = len(pelnas) print knapSack(W, svoris, pelnas, n) # Šį kodą pateikė Nikhilas Kumaras Singhas>>C#b)? a : b; } // Grąžina didžiausią reikšmę, // kurią galima įdėti į W talpos kuprinę knapSack(W, wt, val, n) // Pagrindinis atvejis, jei (n == 0 tegul pelnas = [ 60, 100, 120 ] tegul svoris = [ 10, 20, 30 ]; PHP220>
Laiko sudėtingumas: O(2N)
Pagalbinė erdvė: O(N), rekursijai reikalinga krūvos erdvė
Dinaminio programavimo metodas 0/1 kuprinės problemai spręsti
Atmintinės metodas sprendžiant 0/1 kuprinės problemą:
Pastaba: Reikėtų pažymėti, kad aukščiau pateikta funkcija, naudodama rekursiją, vėl ir vėl apskaičiuoja tas pačias subproblemas. Žiūrėkite šį rekursijos medį, K(1, 1) vertinamas du kartus.
Šiame rekursijos medyje K() nurodo knapSack(). Du parametrai, nurodyti šiame rekursijos medyje, yra n ir W.
Rekursijos medis skirtas sekamoms imties įvestims.
svoris[] = {1, 1, 1}, W = 2, pelnas[] = {10, 20, 30}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)Rekursijos medis, skirtas kuprinės talpai 2 vienetai ir 3 prekės po 1 svorio vienetą.
Kadangi ta pati subproblema kartojasi vėl ir vėl, galime įgyvendinti šią idėją, kad išspręstume problemą.
Jei pirmą kartą susiduriame su antriniu uždaviniu, šią problemą galime išspręsti sukurdami 2-D masyvą, kuriame galima išsaugoti tam tikrą būseną (n, w). Dabar, jei vėl susidursime su ta pačia būsena (n, w), užuot skaičiuoję ją eksponentiniu sudėtingumu, galime tiesiogiai grąžinti jos rezultatą, saugomą lentelėje pastoviu laiku.
sujungti rūšiavimo java
Žemiau pateikiamas pirmiau minėto metodo įgyvendinimas:
C++ // Here is the top-down approach of // dynamic programming #include using namespace std; // Returns the value of maximum profit int knapSackRec(int W, int wt[], int val[], int index, int** dp) { // base condition if (index < 0) return 0; if (dp[index][W] != -1) return dp[index][W]; if (wt[index]>W) { // Išsaugokite funkcijos iškvietimo // dėklo reikšmę lentelėje prieš grąžindami dp[index][W] = knapSackRec(W, wt, val, index - 1, dp); grįžti dp[indeksas][W]; } else { // Išsaugokite reikšmę lentelėje prieš grąžinant dp[index][W] = max(val[index] + knapSackRec(W - wt[index], wt, val, index - 1, dp), knapSackRec(W , wt, val, indeksas - 1, dp)); // Lentelės grąžinimo reikšmė išsaugojus return dp[index][W]; } } int knapSack(int W, int wt[], int val[], int n) { // dvigubas rodyklės // lentelės deklaravimas dinamiškai int** dp; dp = naujas int*[n]; // ciklas, kad būtų galima dinamiškai sukurti lentelę (int i = 0; i< n; i++) dp[i] = new int[W + 1]; // loop to initially filled the // table with -1 for (int i = 0; i < n; i++) for (int j = 0; j < W + 1; j++) dp[i][j] = -1; return knapSackRec(W, wt, val, n - 1, dp); } // Driver Code int main() { int profit[] = { 60, 100, 120 }; int weight[] = { 10, 20, 30 }; int W = 50; int n = sizeof(profit) / sizeof(profit[0]); cout << knapSack(W, weight, profit, n); return 0; }> Java // Here is the top-down approach of // dynamic programming import java.io.*; class GFG { // A utility function that returns // maximum of two integers static int max(int a, int b) { return (a>b)? a : b; } // Grąžina maksimalaus pelno reikšmę static int knapSackRec(int W, int wt[], int val[], int n, int[][] dp) W == 0) return 0; if (dp[n][W] != -1) return dp[n][W]; if (wt[n - 1]> W) // Išsaugokite funkcijos iškvietimo // krūvos reikšmę lentelėje prieš grąžindami return dp[n][W] = knapSackRec(W, wt, val, n - 1, dp); else // Lentelės grąžinimo vertė išsaugojus grąžinimą dp[n][W] = max((val[n - 1] + knapSackRec(W - wt[n - 1], wt, val, n - 1, dp)) , knapSackRec(W, wt, val, n - 1, dp)); static int knapSack(int W, int wt[], int val[], int N) { // Dinamiškai deklaruoti lentelę int dp[][] = new int[N + 1][W + 1]; // Ciklas iš pradžių užpildo // lentelę su -1 for (int i = 0; i< N + 1; i++) for (int j = 0; j < W + 1; j++) dp[i][j] = -1; return knapSackRec(W, wt, val, N, dp); } // Driver Code public static void main(String[] args) { int profit[] = { 60, 100, 120 }; int weight[] = { 10, 20, 30 }; int W = 50; int N = profit.length; System.out.println(knapSack(W, weight, profit, N)); } } // This Code is contributed By FARAZ AHMAD> Python # This is the memoization approach of # 0 / 1 Knapsack in Python in simple # we can say recursion + memoization = DP def knapsack(wt, val, W, n): # base conditions if n == 0 or W == 0: return 0 if t[n][W] != -1: return t[n][W] # choice diagram code if wt[n-1] <= W: t[n][W] = max( val[n-1] + knapsack( wt, val, W-wt[n-1], n-1), knapsack(wt, val, W, n-1)) return t[n][W] elif wt[n-1]>W: t[n][W] = kuprinė (wt, val, W, n-1) grąžinti t[n][W] # Vairuotojo kodas, jei __name__ == '__main__': pelnas = [60, 100, 120] svoris = [10, 20, 30] W = 50 n = len(pelnas) # Iš pradžių inicijuojame matricą su -1. t = [[-1 i diapazone(W + 1)] j diapazone (n + 1)] print(knapsack(svoris, pelnas, W, n)) # Šį kodą pateikė Prosun Kumar Sarkar>'>C# // A utility function that returns // maximum of two integers function max(a, b) { return (a>b)? a : b; } // Grąžina maksimalaus pelno funkcijos knapSackRec(W, wt, val, n,dp) reikšmę // Pagrindinė sąlyga if (n == 0 function knapSack( W, wt,val,N) { // Deklaruoti dp lentelę dinamiškai // Intitilizuojamos dp lentelės (eilutės ir stulpeliai) su -1 žemiau var dp = new Array(N+1).fill(-1).map(el => new Array(W+1).fill(-1) return knapSackRec(W, wt, val, N, dp } var profit = [ 10, 20, 30 ]; var N = pelnas.ilgis; ; console.log(knapSack(W, weight, profit, N) // Šį kodą pateikė akshitsaxenaa09
Išvestis Laiko sudėtingumas: O(N * W). Kadangi išvengiama perteklinių būsenų skaičiavimų.
Pagalbinė erdvė: O(N*W) + O(N). 2D masyvo duomenų struktūra naudojama tarpinėms būsenoms ir O(N) pagalbinei kamino erdvei (ASS) saugoti rekursijos dėkui. „Iš apačios į viršų“ metodas sprendžiant 0/1 kuprinės problemą:
Norėdami išspręsti problemą, vadovaukitės toliau pateikta idėja:
Kadangi antrinės problemos įvertinamos dar kartą, ši problema turi sutampančių poproblemų savybę. Taigi 0/1 kuprinės problema turi abi savybes (žr tai ir tai ) dinaminio programavimo problema. Kaip ir kiti tipiški Dinaminio programavimo (DP) problemos , tų pačių subproblemų pakartotinio skaičiavimo galima išvengti sukūrus laikiną masyvą K[][] „iš apačios į viršų“.
Iliustracija:
java poeilutės metodas
Žemiau yra aukščiau pateikto požiūrio iliustracija:
Leisti, svoris[] = {1, 2, 3}, pelnas[] = {10, 15, 40}, talpa = 6
- Jei neužpildytas joks elementas, galimas pelnas yra 0.
svoris⇢
prekė⇣/ 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 1 2 3
- Norėdami užpildyti pirmą daiktą maišelyje: Jei atliksime aukščiau paminėtą procedūrą, lentelė atrodys taip.
svoris⇢
prekė⇣/ 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 1 0 10 10 10 10 10 10 2 3
- Norėdami užpildyti antrą elementą:
Kai jthWeight = 2, tada didžiausias galimas pelnas yra max (10, DP[1][2-2] + 15) = max(10, 15) = 15.
Kai jthWeight = 3, tada maksimalus galimas pelnas yra maksimalus (2 neįdedamas, 2 įdedamas į maišą) = max(DP[1][3], 15+DP[1][3-2]) = max(10, 25) = 25.
svoris⇢
prekė⇣/ 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 penkiolika 25 25 25 25 3
- Norėdami užpildyti trečią elementą:
Kai jthWeight = 3, didžiausias galimas pelnas yra maks.(DP[2][3], 40+DP[2][3-3]) = max(25, 40) = 40.
Kai jthWeight = 4, didžiausias galimas pelnas yra maks.(DP[2][4], 40+DP[2][4-3]) = max(25, 50) = 50.
Kai jthWeight = 5, didžiausias galimas pelnas yra maks.(DP[2][5], 40+DP[2][5-3]) = max(25, 55) = 55.
Kai jthWeight = 6, didžiausias galimas pelnas yra maks.(DP[2][6], 40+DP[2][6-3]) = max(25, 65) = 65.
svoris⇢
prekė⇣/ 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 penkiolika 25 25 25 25 3 0 10 penkiolika 40 penkiasdešimt 55 65
Žemiau pateikiamas pirmiau minėto metodo įgyvendinimas:
C++ // A dynamic programming based // solution for 0-1 Knapsack problem #include using namespace std; // A utility function that returns // maximum of two integers int max(int a, int b) { return (a>b)? a : b; } // Grąžina didžiausią reikšmę, kurią // galima įdėti į W talpos kuprinę int knapSack(int W, int wt[], int val[], int n) { int i, w; vektorius> K(n + 1, vektorius (W + 1)); // Sukurkite lentelę K[][] iš apačios į viršų, kai (i = 0; i<= n; i++) { for (w = 0; w <= W; w++) if (i == 0 } return K[n][W]; } // Driver Code int main() { int profit[] = { 60, 100, 120 }; int weight[] = { 10, 20, 30 }; int W = 50; int n = sizeof(profit) / sizeof(profit[0]); cout << knapSack(W, weight, profit, n); return 0; } // This code is contributed by Debojyoti Mandal> C // A Dynamic Programming based // solution for 0-1 Knapsack problem #include // A utility function that returns // maximum of two integers int max(int a, int b) { return (a>b)? a : b; } // Grąžina didžiausią reikšmę, kurią // galima įdėti į W talpos kuprinę int knapSack(int W, int wt[], int val[], int n) { int i, w; int K[n + 1][W + 1]; // Sukurkite lentelę K[][] iš apačios į viršų, kai (i = 0; i<= n; i++) { for (w = 0; w <= W; w++) if (i == 0 } return K[n][W]; } // Driver Code int main() { int profit[] = { 60, 100, 120 }; int weight[] = { 10, 20, 30 }; int W = 50; int n = sizeof(profit) / sizeof(profit[0]); printf('%d', knapSack(W, weight, profit, n)); return 0; }> Java // A Dynamic Programming based solution // for 0-1 Knapsack problem import java.io.*; class Knapsack { // A utility function that returns // maximum of two integers static int max(int a, int b) { return (a>b)? a : b; } // Grąžina didžiausią reikšmę, // kurią galima įdėti į W talpos kuprinę static int knapSack(int W, int wt[], int val[], int n) { int i, w; int K[][] = naujas int[n + 1][W + 1]; // Sukurkite lentelę K[][] iš apačios į viršų, kai (i = 0; i<= n; i++) { for (w = 0; w <= W; w++) if (i == 0 } return K[n][W]; } // Driver code public static void main(String args[]) { int profit[] = new int[] { 60, 100, 120 }; int weight[] = new int[] { 10, 20, 30 }; int W = 50; int n = profit.length; System.out.println(knapSack(W, weight, profit, n)); } } /*This code is contributed by Rajat Mishra */> Python # 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 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 if __name__ == '__main__': profit = [60, 100, 120] weight = [10, 20, 30] W = 50 n = len(profit) print(knapSack(W, weight, profit, n)) # This code is contributed by Bhavya Jain>
C# // A Dynamic Programming based solution for // 0-1 Knapsack problem using System; class GFG { // A utility function that returns // maximum of two integers static int max(int a, int b) { return (a>b)? a : b; } // Grąžina didžiausią reikšmę, kurią // galima įdėti į // talpos W kuprinę static int knapSack(int W, int[] wt, int[] val, int n) { int i, w; int[, ] K = naujas int[n + 1, W + 1]; // Sukurkite lentelę K[][] apačios // į viršų būdu (i = 0; i<= n; i++) { for (w = 0; w <= W; w++) } return K[n, W]; } // Driver code static void Main() { int[] profit = new int[] { 60, 100, 120 }; int[] weight = new int[] { 10, 20, 30 }; int W = 50; int n = profit.Length; Console.WriteLine(knapSack(W, weight, profit, n)); } } // This code is contributed by Sam007> Javascript // A Dynamic Programming based solution // for 0-1 Knapsack problem // A utility function that returns // maximum of two integers function max(a, b) { return (a>b)? a : b; } // Grąžina didžiausią reikšmę, // kurią galima įdėti į W talpos kuprinę function knapSack(W, wt, val, n) { let i, w; tegul K = naujas Masyvas(n + 1); // Sukurkite lentelę K[][] iš apačios į viršų, kai (i = 0; i<= n; i++) { K[i] = new Array(W + 1); for (w = 0; w <= W; w++) w == 0) K[i][w] = 0; else if (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]; } let profit = [ 60, 100, 120 ]; let weight = [ 10, 20, 30 ]; let W = 50; let n = profit.length; console.log(knapSack(W, weight, profit, n));> PHP // A Dynamic Programming based solution // for 0-1 Knapsack problem // Returns the maximum value that // can be put in a knapsack of // capacity W function knapSack($W, $wt, $val, $n) { $K = array(array()); // Build table K[][] in // bottom up manner for ($i = 0; $i <= $n; $i++) { for ($w = 0; $w <= $W; $w++) } return $K[$n][$W]; } // Driver Code $profit = array(60, 100, 120); $weight = array(10, 20, 30); $W = 50; $n = count($profit); echo knapSack($W, $weight, $profit, $n); // This code is contributed by Sam007. ?>>>
Išvestis Laiko sudėtingumas: O(N * W). kur „N“ yra elementų skaičius, o „W“ yra talpa.
Pagalbinė erdvė: O(N * W). 2D dydžio „N*W“ masyvo naudojimas. Erdvės optimizuotas požiūris į 0/1 kuprinės problemą naudojant dinaminį programavimą:
Norėdami išspręsti problemą, vadovaukitės toliau pateikta idėja:
Apskaičiuojant dabartinę dp[] masyvo eilutę reikia tik ankstesnės eilutės, bet jei eilutes pradedame eiti iš dešinės į kairę, tai galima padaryti tik su viena eilute
Žemiau pateikiamas pirmiau minėto metodo įgyvendinimas:
C++ // C++ program for the above approach #include using namespace std; // Function to find the maximum profit int knapSack(int W, int wt[], int val[], int n) { // Making and initializing dp array int dp[W + 1]; memset(dp, 0, sizeof(dp)); for (int i = 1; i < n + 1; i++) { for (int w = W; w>= 0; w--) { if (wt[i - 1]<= w) // Finding the maximum value dp[w] = max(dp[w], dp[w - wt[i - 1]] + val[i - 1]); } } // Returning the maximum value of knapsack return dp[W]; } // Driver code int main() { int profit[] = { 60, 100, 120 }; int weight[] = { 10, 20, 30 }; int W = 50; int n = sizeof(profit) / sizeof(profit[0]); cout << knapSack(W, weight, profit, n); return 0; }> Java // Java program for the above approach import java.util.*; class GFG { static int knapSack(int W, int wt[], int val[], int n) { // Making and initializing dp array int[] dp = new int[W + 1]; for (int i = 1; i < n + 1; i++) { for (int w = W; w>= 0; w--) { if (wt[i - 1]<= w) // Finding the maximum value dp[w] = Math.max(dp[w], dp[w - wt[i - 1]] + val[i - 1]); } } // Returning the maximum value of knapsack return dp[W]; } // Driver code public static void main(String[] args) { int profit[] = { 60, 100, 120 }; int weight[] = { 10, 20, 30 }; int W = 50; int n = profit.length; System.out.print(knapSack(W, weight, profit, n)); } } // This code is contributed by gauravrajput1> Python # Python code to implement the above approach def knapSack(W, wt, val, n): # Making the dp array dp = [0 for i in range(W+1)] # Taking first i elements for i in range(1, n+1): # Starting from back, # so that we also have data of # previous computation when taking i-1 items for w in range(W, 0, -1): if wt[i-1] <= w: # Finding the maximum value dp[w] = max(dp[w], dp[w-wt[i-1]]+val[i-1]) # Returning the maximum value of knapsack return dp[W] # Driver code if __name__ == '__main__': profit = [60, 100, 120] weight = [10, 20, 30] W = 50 n = len(profit) print(knapSack(W, weight, profit, n)) # This code is contributed by Suyash Saxena>
C# // Java program for the above approach using System; public class GFG { static int knapSack(int W, int[] wt, int[] val, int n) { // Making and initializing dp array int[] dp = new int[W + 1]; for (int i = 1; i < n + 1; i++) { for (int w = W; w>= 0; w--) { if (wt[i - 1]<= w) // Finding the maximum value dp[w] = Math.Max(dp[w], dp[w - wt[i - 1]] + val[i - 1]); } } // Returning the maximum value of knapsack return dp[W]; } // Driver code public static void Main(String[] args) { int[] profit = { 60, 100, 120 }; int[] weight = { 10, 20, 30 }; int W = 50; int n = profit.Length; Console.Write(knapSack(W, weight, profit, n)); } } // This code is contributed by gauravrajput1> Javascript function knapSack(W , wt , val , n) { // Making and initializing dp array var dp = Array(W + 1).fill(0); for (i = 1; i < n + 1; i++) { for (w = W; w>= 0; w--) { if (wt[i - 1]<= w) // Finding the maximum value dp[w] = Math.max(dp[w], dp[w - wt[i - 1]] + val[i - 1]); } } // Returning the maximum value of knapsack return dp[W]; } // Driver code var profit = [ 60, 100, 120 ]; var weight = [ 10, 20, 30 ]; var W = 50; var n = profit.length; console.log(knapSack(W, weight, profit, n)); // This code is contributed by Rajput-Ji>
Išvestis Laiko sudėtingumas : O(N * W). Kadangi išvengiama perteklinių būsenų skaičiavimų
Pagalbinė erdvė : O(W) Kadangi mes naudojame 1-D masyvą, o ne 2-D masyvą