logo

0/1 Problem z nahrbtnikom

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:

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

Priporočena praksa 0 – 1 Težava z nahrbtnikom Poskusite!

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 java

Optimalna 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⇣/
0123456
00000000
1
2
3
  • Za polnjenje prvega predmeta v vrečki: Če sledimo zgoraj navedenemu postopku, bo tabela videti takole.
teža⇢
element⇣/
0123456
00000000
10101010101010
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⇣/
0123456
00000000
10101010101010
2010petnajst25252525
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⇣/
0123456
00000000
10101010101010
2010petnajst25252525
3010petnajst40petdeset5565

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