Predpogoji: Uvod v problem nahrbtnika, njegove vrste in kako jih rešiti
dano n predmetov, pri katerih ima vsak predmet določeno težo in dobiček, ki je povezan z njim, poleg tega pa ima vrečko s prostornino IN , [tj. vrečka lahko drži največ IN teža v njem]. Naloga je spraviti predmete v vrečko tako, da je vsota dobička, povezana z njimi, največja možna.
Opomba: Omejitev tukaj je, da lahko predmet v celoti spravimo v vrečko ali pa ga sploh ne moremo [V vrečko ni mogoče dati dela predmeta].
Primeri:
Priporočena praksa 0 – 1 Težava z nahrbtnikom Poskusite!Vnos: N = 3, W = 4, dobiček [] = {1, 2, 3}, teža [] = {4, 5, 1}
Izhod: 3
Pojasnilo: Obstajata dva elementa, ki imata težo manjšo ali enako 4. Če izberemo element s težo 4, je možni dobiček 1. In če izberemo element z težo 1, je možni dobiček 3. Torej največji možni dobiček je 3. Upoštevajte, da ne moremo dati obeh elementov s težo 4 in 1 skupaj, saj je zmogljivost vrečke 4.Vnos: N = 3, W = 3, dobiček [] = {1, 2, 3}, teža [] = {4, 5, 6}
Izhod: 0
Rekurzijski pristop za problem nahrbtnika 0/1:
Za rešitev težave sledite spodnji zamisli:
Preprosta rešitev je, da upoštevate vse podnabore postavk in izračunate skupno težo in dobiček vseh podnaborov. Upoštevajte edine podmnožice, katerih skupna teža je manjša od W. Iz vseh takih podmnožic izberite podmnožico z največjim dobičkom.
kako pretvoriti celo število v niz javaOptimalna podkonstrukcija : Če želite upoštevati vse podnabore postavk, sta lahko za vsako postavko dva primera.
- 1. primer: Postavka je vključena v optimalni podnabor.
- 2. primer: Artikel ni vključen v optimalen komplet.
Za rešitev težave sledite spodnjim korakom:
Največja vrednost, dobljena iz postavk 'N', je največja od naslednjih dveh vrednosti.
- Primer 1 (vključuje Nthpostavka): Vrednost Nthpostavka plus največja vrednost, dobljena s preostalimi N-1 postavkami in preostalo težo, tj. (W-teža Nthpostavka).
- Primer 2 (izključite Nthpostavka): Največja vrednost, pridobljena z N-1 postavkami in W težo.
- Če je teža „Nth' postavka večja od 'W', potem N-te postavke ni mogoče vključiti in Primer 2 je edina možnost.
Spodaj je izvedba zgornjega pristopa:
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; } // Vrne največjo vrednost, // ki jo je mogoče dati v nahrbtnik s kapaciteto W int knapSack(int W, int wt[], int val[], int n) // Osnovni primer if (n == 0 // Driver code int main() { int profit[] = { 60, 100, 120 } = { 10, 20, 30 }; int n = sizeof(profit) / sizeof(profit[) 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; } // Vrne največjo vrednost, ki jo // lahko damo v nahrbtnik s kapaciteto W int knapSack(int W, int wt[], int val[], int n) W == 0) return 0; // Če je teža n-tega predmeta večja od // zmogljivosti nahrbtnika W, tega predmeta // ni mogoče vključiti v optimalno rešitev, če (wt[n - 1]> W) return knapSack(W, wt, val, n - 1); // Vrne največ dva primera: // (1) vključen n-ti element // (2) ni vključen sicer vrni max( val[n - 1] + knapSack(W - wt[n - 1], wt, val, n - 1), nahrbtna vreča (W, wt, val, n - 1)); // Koda gonilnika int main() { int profit[] = { 60, 100, 120 }; int teža [] = { 10, 20, 30 }; int W = 50; int n = sizeof(profit) / sizeof(profit[0]); printf('%d', nahrbtnik(W, teža, dobiček, n)); vrni 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; } // Vrne največjo vrednost, // ki jo je mogoče dati v nahrbtnik // kapacitete W static int knapSack(int W, int wt[], int val[], int n) // Koda gonilnika public static void main( String args[]) { int profit[] = new int[] { 60, 100, 120 }; int teža[] = novo int[] { 10, 20, 30 }; int W = 50; int n = profit.length; System.out.println(knapSack(W, teža, dobiček, n)); } } /*To kodo je prispeval 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): vrni knapSack(W, wt, val, n-1) # vrni največ dva primera: # (1) vključen n-ti element # (2) ni vključen drugje: vrni max( val[n-1] + knapSack ( W-wt[n-1], wt, val, n-1), knapSack(W, wt, val, n-1)) # konec funkcije knapSack # koda gonilnika, če je __ime__ == '__main__': dobiček = [60, 100, 120] teža = [10, 20, 30] W = 50 n = len(profit) print knapSack(W, teža, dobiček, n) # To kodo je prispeval Nikhil Kumar Singh>
C# /* A Naive recursive implementation of 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; } // Vrne največjo vrednost, // ki jo je mogoče dati v nahrbtnik s kapaciteto W static int knapSack(int W, int[] wt, int[] val, int n) W == 0) return 0; // Če je teža n-tega predmeta // večja od kapacitete nahrbtnika W, // tega predmeta ni mogoče // vključiti v optimalno rešitev, če (wt[n - 1]> W) return knapSack(W, wt, val , n - 1); // Vrne največ dva primera: // (1) vključen n-ti element // (2) ni vključen sicer vrni max(val[n - 1] + knapSack(W - wt[n - 1], wt, val, n - 1), nahrbtna vreča (W, wt, val, n - 1)); // Koda gonilnika public static void Main() { int[] profit = new int[] { 60, 100, 120 }; int[] teža = novo int[] { 10, 20, 30 }; int W = 50; int n = profit.Length; Console.WriteLine(knapSack(W, teža, dobiček, n)); } } // To kodo je prispeval Sam007> Javascript /* A Naive recursive implementation of 0-1 Knapsack problem */ // A utility function that returns // maximum of two integers function max(a, b) { return (a>b)? a : b; } // Vrne največjo vrednost, // ki jo je mogoče dati v nahrbtnik s kapaciteto W function knapSack(W, wt, val, n) // Osnovni primer if (n == 0 let profit = [ 60, 100, 120 ] ; naj teža = [ 10, 20, 30 ]; naj n = profit.log (knapSack (W, teža, n));PHP220> Časovna zapletenost: O(2n)
Pomožni prostor: O(N), potreben prostor sklada za rekurzijo
Pristop dinamičnega programiranja za problem nahrbtnika 0/1
Pristop pomnjenja za problem nahrbtnika 0/1:
Opomba: Upoštevati je treba, da zgornja funkcija z uporabo rekurzije znova in znova izračunava iste podprobleme. Glejte naslednje rekurzijsko drevo, K(1, 1) je dvakrat ocenjen.
V naslednjem drevesu rekurzije je K() se nanaša na nahrbtnik(). Dva parametra, navedena v naslednjem rekurzivnem drevesu, sta n in W.
Rekurzijsko drevo je za naslednje vzorčne vnose.
teža[] = {1, 1, 1}, W = 2, dobiček [] = {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)
Rekurzijsko drevo za kapaciteto nahrbtnika 2 enoti in 3 predmete teže 1 enote.
Ker se vedno znova isti podproblem ponavlja, lahko za rešitev problema izvedemo naslednjo idejo.
Če prvič dobimo podproblem, lahko ta problem rešimo tako, da ustvarimo 2-D niz, ki lahko shrani določeno stanje (n, w). Zdaj, če znova naletimo na isto stanje (n, w), namesto da bi ga izračunali v eksponentni kompleksnosti, lahko neposredno vrnemo njegov rezultat, shranjen v tabeli v konstantnem času.
indeks jave
Spodaj je izvedba zgornjega pristopa:
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) { // Shrani vrednost klica funkcije // sklad v tabeli pred vrnitvijo dp[index][W] = knapSackRec(W, wt, val, index - 1, dp); vrni dp[indeks][W]; } else { // Shrani vrednost v tabelo pred vrnitvijo dp[index][W] = max(val[index] + knapSackRec(W - wt[index], wt, val, index - 1, dp), knapSackRec(W , wt, val, indeks - 1, dp)); // Povrnjena vrednost tabele po shranjevanju return dp[index][W]; } } int knapSack(int W, int wt[], int val[], int n) { // dvojni kazalec za // dinamično deklaracijo tabele int** dp; dp = novo int*[n]; // zanka za dinamično ustvarjanje tabele za (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; } // Vrne vrednost največjega dobička static int knapSackRec(int W, int wt[], int val[], int n, int[][] dp) W == 0) return 0; if (dp[n][W] != -1) vrni dp[n][W]; if (wt[n - 1]> W) // Shrani vrednost klica funkcije // sklad v tabeli pred vrnitvijo return dp[n][W] = knapSackRec(W, wt, val, n - 1, dp); else // Povrnjena vrednost tabele po shranjevanju return 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čno deklariraj tabelo int dp[][] = novo int[N + 1][W + 1]; // Zanka za prvotno zapolnitev // tabele z -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] = nahrbtnik(wt, val, W, n-1) return t[n][W] # Koda voznika if __name__ == '__main__': profit = [60, 100, 120] teža = [10, 20, 30] W = 50 n = len(profit) # Najprej inicializiramo matriko z -1. t = [[-1 za i v obsegu (W + 1)] za j v obsegu (n + 1)] print(nahrbtnik(teža, dobiček, W, n)) # To kodo je prispeval Prosun Kumar Sarkar>'>C# // A utility function that returns // maximum of two integers function max(a, b) { return (a>b)? a : b; } // Vrne vrednost največjega dobička funkcija knapSackRec(W, wt, val, n,dp) // Osnovni pogoj if (n == 0 funkcija knapSack( W, wt,val,N) { // Deklariraj tabelo dp dinamično // Inicializacija tabel dp (vrstice in stolpci) z -1 pod var dp = new Array(N+1).fill(-1).map(el => new Array(W+1).fill(-1) ); return knapSack(W, wt, N, dp); var. profit= [ 10, 20, 30 ]; var N = profit.length ; console.log(knapSack(W, weight, N)); // To kodo je prispeval akshitsaxenaa09
Izhod 220>
Časovna zapletenost: O(N * Š). Ker se izognemo odvečnim izračunom stanj.
Pomožni prostor: O(N * Š) + O(N). Uporaba podatkovne strukture 2D matrike za shranjevanje vmesnih stanj in O(N) pomožnega skladovnega prostora (ASS) je bila uporabljena za rekurzivni sklad
Pristop od spodaj navzgor za problem z nahrbtnikom 0/1:
Za rešitev težave sledite spodnji zamisli:
Ker so podproblemi ponovno ovrednoteni, ima ta problem lastnost Prekrivajočih se podproblemov. Torej ima problem nahrbtnika 0/1 obe lastnosti (glejte to in to ) problema dinamičnega programiranja. Kot drugi tipični Težave z dinamičnim programiranjem (DP). , se je mogoče izogniti ponovnemu izračunu istih podproblemov z izdelavo začasne matrike K[][] na način od spodaj navzgor.
Ilustracija:
Spodaj je ilustracija zgornjega pristopa:
Pustiti, teža[] = {1, 2, 3}, dobiček [] = {10, 15, 40}, zmogljivost = 6
- Če noben element ni izpolnjen, je možen dobiček 0.
teža⇢
element⇣/ 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 1 2 3
- Za polnjenje prvega predmeta v vrečki: Če sledimo zgoraj navedenemu postopku, bo tabela videti takole.
teža⇢
element⇣/ 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
- Za polnjenje druge postavke:
Ko je jthWeight = 2, je največji možni dobiček max (10, DP[1][2-2] + 15) = max(10, 15) = 15.
Ko je jthWeight = 3, je največji možni dobiček max(2 ni dano, 2 je dano v vrečko) = max(DP[1][3], 15+DP[1][3-2]) = max(10, 25) = 25.
teža⇢
element⇣/ 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 petnajst 25 25 25 25 3
- Za izpolnitev tretje postavke:
Ko je jthWeight = 3, je največji možni dobiček max(DP[2][3], 40+DP[2][3-3]) = max(25, 40) = 40.
Ko je jthWeight = 4, je največji možni dobiček max(DP[2][4], 40+DP[2][4-3]) = max(25, 50) = 50.
Ko je jthWeight = 5, je največji možni dobiček max(DP[2][5], 40+DP[2][5-3]) = max(25, 55) = 55.
Ko je jthWeight = 6, je največji možni dobiček max(DP[2][6], 40+DP[2][6-3]) = max(25, 65) = 65.
teža⇢
element⇣/ 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 petnajst 25 25 25 25 3 0 10 petnajst 40 petdeset 55 65
Spodaj je izvedba zgornjega pristopa:
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; } // Vrne največjo vrednost, // ki jo je mogoče dati v nahrbtnik s kapaciteto W int knapSack(int W, int wt[], int val[], int n) { int i, w; vektor> K(n + 1, vektor (W + 1)); // Gradi tabelo K[][] na način od spodaj navzgor za (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; } // Vrne največjo vrednost, // ki jo je mogoče dati v nahrbtnik s kapaciteto W int knapSack(int W, int wt[], int val[], int n) { int i, w; int K[n + 1][W + 1]; // Gradi tabelo K[][] na način od spodaj navzgor za (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; } // Vrne največjo vrednost, // ki jo je mogoče dati v nahrbtnik s kapaciteto W static int knapSack(int W, int wt[], int val[], int n) { int i, w; int K[][] = novo int[n + 1][W + 1]; // Gradi tabelo K[][] na način od spodaj navzgor za (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; } // Vrne največjo vrednost, // ki jo je mogoče dati v nahrbtnik // kapacitete W static int knapSack(int W, int[] wt, int[] val, int n) { int i, w; int[,] K = novo int[n + 1, W + 1]; // Sestavi tabelo K[][] na način spodaj // navzgor za (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; } // Vrne največjo vrednost, // ki jo je mogoče dati v nahrbtnik s kapaciteto W function knapSack(W, wt, val, n) { let i, w; naj K = nova matrika (n + 1); // Gradi tabelo K[][] na način od spodaj navzgor za (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. ?>>
Izhod Časovna zapletenost: O(N * Š). kjer je 'N' število elementov in 'W' je zmogljivost.
Pomožni prostor: O(N * Š). Uporaba dvodimenzionalne matrike velikosti 'N*W'. Prostorsko optimiziran pristop za problem nahrbtnika 0/1 z uporabo dinamičnega programiranja:
Za rešitev težave sledite spodnji zamisli:
Za izračun trenutne vrstice matrike dp[] potrebujemo samo prejšnjo vrstico, če pa začnemo vrstice prečkati od desne proti levi, lahko to storimo samo z eno vrstico
java pretvori niz v int
Spodaj je izvedba zgornjega pristopa:
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>
Izhod 220>
Časovna zapletenost : O(N * Š). Ker se izognemo odvečnim izračunom stanj
Pomožni prostor : O(W) Ker uporabljamo 1-D polje namesto 2-D polja