logo

0/1 Problem z plecakiem

Warunki wstępne: Wprowadzenie do problemu plecakowego, jego rodzajów i sposobów ich rozwiązywania

Dany N przedmioty, z których każdy ma pewną wagę i zysk, a także torbę o dużej pojemności W , [tj. torba może pomieścić co najwyżej W w nim waga]. Zadanie polega na umieszczeniu przedmiotów w worku w taki sposób, aby suma zysków z nimi związanych była jak największa.



Notatka: Ograniczenie polega na tym, że możemy albo włożyć przedmiot do torby w całości, albo nie możemy go w ogóle włożyć [Nie jest możliwe włożenie części przedmiotu do torby].

Przykłady:

Wejście: N = 3, W = 4, zysk [] = {1, 2, 3}, waga [] = {4, 5, 1}
Wyjście: 3
Wyjaśnienie: Istnieją dwa przedmioty, które mają wagę mniejszą lub równą 4. Jeśli wybierzemy przedmiot o wadze 4, możliwy zysk wyniesie 1. A jeśli wybierzemy przedmiot o wadze 1, możliwy zysk wyniesie 3. Zatem maksymalny możliwy zysk wynosi 3. Należy pamiętać, że nie możemy połączyć razem przedmiotów o wadze 4 i 1, ponieważ pojemność worka wynosi 4.



Wejście: N = 3, W = 3, zysk [] = {1, 2, 3}, waga [] = {4, 5, 6}
Wyjście: 0

Zalecana praktyka 0 – 1 Problem z plecakiem Spróbuj!

Podejście rekurencyjne dla problemu plecakowego 0/1:

Aby rozwiązać problem, postępuj zgodnie z poniższym pomysłem:

Prostym rozwiązaniem jest uwzględnienie wszystkich podzbiorów pozycji i obliczenie całkowitej wagi i zysku wszystkich podzbiorów. Rozważmy tylko podzbiory, których całkowita waga jest mniejsza niż W. Ze wszystkich takich podzbiorów wybierz podzbiór z maksymalnym zyskiem.



uruchom ponownie mysql ubuntu

Optymalna podbudowa : Aby uwzględnić wszystkie podzbiory elementów, dla każdego elementu mogą wystąpić dwa przypadki.

  • Przypadek 1: Element zalicza się do podzbioru optymalnego.
  • Przypadek 2: Artykuł nie wchodzi w skład zestawu optymalnego.

Wykonaj poniższe kroki, aby rozwiązać problem:

Maksymalna wartość uzyskana z pozycji „N” jest maksymalną z dwóch następujących wartości.

  • Przypadek 1 (uwzględnij Ntpozycja): Wartość Ntprzedmiot plus maksymalna wartość uzyskana przez pozostałe N-1 elementy i pozostałą wagę, tj. (W-waga Ntprzedmiot).
  • Przypadek 2 (wyłączając Ntpozycja): Maksymalna wartość uzyskana przez N-1 pozycji i wagę W.
  • Jeżeli masa „Nt„ pozycja jest większa niż „W”, wówczas N-ta pozycja nie może zostać uwzględniona i Przypadek 2 jest jedyną możliwością.

Poniżej implementacja powyższego podejścia:

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) ? za: b; } // Zwraca maksymalną wartość // jaką można umieścić w plecaku o pojemności W int knapSack(int W, int wt[], int val[], int n) // Przypadek podstawowy if (n == 0 // Kod sterownika int main() { int zysk[] = { 60, 100, 120 } int waga[] = { 10, 20, 30 }; int W = 50; int n = rozmiar(zysk) / rozmiar(zysk[; 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) ? za: b; } // Zwraca maksymalną wartość, // jaką można // umieścić w plecaku o pojemności W int knapSack(int W, int wt[], int val[], int n) W == 0) return 0;  // Jeżeli waga n-tego przedmiotu jest większa niż // Pojemność plecaka W, to przedmiot ten // nie może zostać uwzględniony w rozwiązaniu optymalnym jeśli (wt[n - 1]> W) return knapSack(W, wt, val, n - 1);  // Zwraca maksymalnie dwa przypadki: // (1) n-ty element uwzględniony // (2) nie uwzględniony else return max( val[n - 1] + knapSack(W - wt[n - 1], wt, val, n - 1), knapSack(W, wt, val, n - 1));  // Kod sterownika int main() { int zysk[] = { 60, 100, 120 };  int waga[] = { 10, 20, 30 };  int W = 50;  int n = rozmiar(zysk) / rozmiar(zysk[0]);  printf('%d', knapSack(W, waga, zysk, n));  zwróć 0; }>
Jawa
/* 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) ? za: b; } // Zwraca maksymalną wartość, // którą można // zmieścić w plecaku o // pojemności W static int knapSack(int W, int wt[], int val[], int n) // Kod kierowcy public static void main( String args[]) { int zysk[] = nowy int[] { 60, 100, 120 };  int waga[] = nowa int[] { 10, 20, 30 };  int W = 50;  int n = zysk.długość;  System.out.println(knapSack(W, waga, zysk, n));  } } /*Ten kod jest autorstwa Rajata Mishry */>
Pyton
# 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) # zwróć maksymalnie dwa przypadki: # (1) n-ty element uwzględniony # (2) nie uwzględniony else: return max( val[n-1] + knapSack ( W-wt[n-1], wt, val, n-1), knapSack(W, wt, val, n-1)) # koniec funkcji knapSack # Kod sterownika jeśli __name__ == '__main__': zysk = [60, 100, 120] waga = [10, 20, 30] W = 50 n = len(zysk) print knapSack(W, waga, zysk, n) # Autorem tego kodu jest 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) ? za: b; } // Zwraca maksymalną wartość, // jaką można // zmieścić w plecaku o pojemności W static int knapSack(int W, int[] wt, int[] val, int n) W == 0) return 0;  // Jeżeli waga n-tego przedmiotu jest // większa niż pojemność plecaka W, // to tego przedmiotu nie można // uwzględnić w rozwiązaniu optymalnym jeśli (wt[n - 1]> W) return knapSack(W, wt, val , n - 1);  // Zwraca maksymalnie dwa przypadki: // (1) n-ty element uwzględniony // (2) nie uwzględniony else return max(val[n - 1] + knapSack(W - wt[n - 1], wt, val, n - 1), knapSack(W, wt, val, n - 1));    // Kod sterownika public static void Main() { int[] zysk = nowy int[] { 60, 100, 120 };  int[] waga = nowa int[] { 10, 20, 30 };  int W = 50;  int n = zysk.Długość;  Console.WriteLine(knapSack(W, waga, zysk, n));  } } // Ten kod pochodzi od 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) ? za: b;  } // Zwraca maksymalną wartość, którą // można zmieścić w plecaku o pojemności W funkcja knapSack(W, wt, val, n) // Przypadek bazowy if (n == 0 let zysk = [ 60, 100, 120 ] ; niech waga = [ 10, 20, 30 ]; niech W = 50; niech n = zysk.długość; konsola.log(knapSack(W, waga, zysk, n));PHP220>

Złożoność czasowa: O(2N)
Przestrzeń pomocnicza: O(N), miejsce na stosie wymagane do rekurencji

Podejście do programowania dynamicznego dla problemu plecakowego 0/1

Metoda zapamiętywania problemu plecakowego 0/1:

Notatka: Należy zauważyć, że powyższa funkcja wykorzystująca rekurencję oblicza w kółko te same podproblemy. Zobacz poniższe drzewo rekurencji, K(1, 1) jest oceniane dwukrotnie.

W poniższym drzewie rekurencji K() odnosi się do knapSack(). Dwa parametry wskazane w poniższym drzewie rekurencji to n i W.
Drzewo rekurencji służy do następujących przykładowych danych wejściowych.
waga[] = {1, 1, 1}, W = 2, zysk[] = {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)

Drzewo rekurencji dla pojemności plecaka 2 jednostki i 3 pozycji o wadze 1 jednostki.

Ponieważ ten sam podproblem stale się powtarza, możemy zastosować następujący pomysł, aby rozwiązać problem.

Jeśli za pierwszym razem napotkamy podproblem, możemy go rozwiązać, tworząc tablicę 2-D, w której można przechowywać określony stan (n, w). Teraz, jeśli ponownie natkniemy się na ten sam stan (n, w), zamiast obliczać go ze złożonością wykładniczą, możemy bezpośrednio zwrócić jego wynik zapisany w tabeli w stałym czasie.

10 procent z 60

Poniżej implementacja powyższego podejścia:

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) { // Zapisz wartość wywołania funkcji // stos w tabeli przed zwrotem dp[indeks][W] = knapSackRec(W, wt, val, indeks - 1, dp);  return dp[indeks][W];  } else { // Zapisz wartość w tabeli przed zwrotem dp[indeks][W] = max(val[indeks] + knapSackRec(W - wt[indeks], wt, val, indeks - 1, dp), knapSackRec(W , wt, val, indeks - 1, dp));  // Zwraca wartość tabeli po zapisaniu return dp[indeks][W];  } } int knapSack(int W, int wt[], int val[], int n) { // podwójny wskaźnik do dynamicznej deklaracji // tabeli int** dp;  dp = nowy int*[n];  // pętla do dynamicznego tworzenia tabeli dla (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; }>
Jawa
// 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) ? za: b; } // Zwraca wartość maksymalnego zysku static int knapSackRec(int W, int wt[], int val[], int n, int[][] dp) W == 0) return 0;  if (dp[n][W] != -1) zwróć dp[n][W];  if (wt[n - 1]> W) // Zapisz wartość wywołania funkcji // stos w tabeli przed powrotem return dp[n][W] = knapSackRec(W, wt, val, n - 1, dp);  else // Zwraca wartość tabeli po zapisaniu 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) { // Dynamiczna deklaracja tabeli int dp[][] = new int[N + 1][W + 1];  // Pętla, która początkowo wypełni tabelę // wartością -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>
Pyton
# 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] = plecak(wt, val, W, n-1) return t[n][W] # Kod kierowcy if __name__ == '__main__': zysk = [60, 100, 120] waga = [10, 20, 30] W = 50 n = len(zysk) # Na początku inicjujemy macierz z -1. t = [[-1 dla i w zakresie (W + 1)] dla j w zakresie (n + 1)] print(plecak(waga, zysk, W, n)) # Ten kod jest autorstwa Prosuna Kumara Sarkara>'>C# 
// A utility function that returns // maximum of two integers  function max(a, b)  {   return (a>B) ? za: b;  } // Zwraca wartość funkcji maksymalnego zysku knapSackRec(W, wt, val, n,dp) // Warunek bazowy if (n == 0 funkcja knapSack( W, wt,val,N) { // Deklaracja tabeli dp dynamicznie // Inicjowanie tabel dp (wiersz i kolumny) z -1 poniżej var dp = new Array(N+1).fill(-1).map(el => new Array(W+1).fill(-1) ); return knapSackRec(W, wt, val, N, dp); var zysk= [ 60, 100, 120 ]; var waga = [ 10, 20, 30 ]; var W = 50; ; console.log(knapSack(W, waga, zysk, N)); // Ten kod został napisany przez akshitsaxenaa09  
Wyjście
220>

Złożoność czasowa: O(N * W). Ponieważ unika się zbędnych obliczeń stanów.
Przestrzeń pomocnicza: O(N * W) + O(N). Do stosu rekurencji wykorzystano strukturę danych tablicowych 2D do przechowywania stanów pośrednich i pomocniczej przestrzeni stosu O(N) (ASS).

Podejście oddolne do problemu plecakowego 0/1:

Aby rozwiązać problem, postępuj zgodnie z poniższym pomysłem:

Ponieważ podproblemy są ponownie oceniane, problem ten ma właściwość nakładających się podproblemów. Zatem problem plecaka 0/1 ma obie właściwości (patrz Ten I Ten ) problemu programowania dynamicznego. Podobnie jak inne typowe Problemy z programowaniem dynamicznym (DP). , można uniknąć ponownego obliczania tych samych podproblemów, konstruując tymczasową tablicę K[][] w sposób oddolny.

Ilustracja:

Poniżej znajduje się ilustracja powyższego podejścia:

Pozwalać, waga[] = {1, 2, 3}, zysk [] = {10, 15, 40}, Pojemność = 6

tostrowanie Java
  • Jeśli żaden element nie jest wypełniony, możliwy zysk wynosi 0.
waga⇢
przedmiot⇣/
0123456
00000000
1
2
3
  • Aby wypełnić pierwszą sztukę w torbie: Jeśli zastosujemy się do powyższej procedury, tabela będzie wyglądać następująco.
waga⇢
przedmiot⇣/
0123456
00000000
10101010101010
2
3
  • Do wypełnienia drugiej pozycji:
    Gdy jthWeight = 2, wówczas maksymalny możliwy zysk wynosi max (10, DP[1][2-2] + 15) = max(10, 15) = 15.
    Gdy j-ta waga = 3, wówczas maksymalny możliwy zysk wynosi max (2 nie odłożone, 2 odłożone do worka) = max (DP[1] [3], 15+DP[1] [3-2]) = max (10, 25) = 25.
waga⇢
przedmiot⇣/
0123456
00000000
10101010101010
2010piętnaście25252525
3
  • Do wypełnienia trzeciej pozycji:
    Gdy j-ta waga = 3, maksymalny możliwy zysk wynosi max(DP[2][3], 40+DP[2][3-3]) = max(25, 40) = 40.
    Gdy j-ta waga = 4, maksymalny możliwy zysk wynosi max(DP[2][4], 40+DP[2][4-3]) = max(25, 50) = 50.
    Gdy j-ta waga = 5, maksymalny możliwy zysk wynosi max(DP[2][5], 40+DP[2][5-3]) = max(25, 55) = 55.
    Gdy j-ta waga = 6, maksymalny możliwy zysk wynosi max(DP[2][6], 40+DP[2][6-3]) = max(25, 65) = 65.
waga⇢
przedmiot⇣/
0123456
00000000
10101010101010
2010piętnaście25252525
3010piętnaście40pięćdziesiąt5565

Poniżej implementacja powyższego podejścia:

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) ? za: b; } // Zwraca maksymalną wartość // jaką można umieścić w plecaku o pojemności W int knapSack(int W, int wt[], int val[], int n) { int i, w;  wektor> K(n + 1, wektor (W + 1));  // Zbuduj tabelę K[][] od dołu do góry dla (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) ? za: b; } // Zwraca maksymalną wartość // jaką można umieścić w plecaku o pojemności W int knapSack(int W, int wt[], int val[], int n) { int i, w;  int K[n + 1][W + 1];  // Zbuduj tabelę K[][] od dołu do góry dla (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; }>
Jawa
// 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) ? za: b; } // Zwraca maksymalną wartość, // jaką można // zmieścić w plecaku o pojemności W static int knapSack(int W, int wt[], int val[], int n) { int i, w;  int K[][] = nowa int[n + 1][W + 1];  // Zbuduj tabelę K[][] od dołu do góry dla (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 */>
Pyton
# 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) ? za: b; } // Zwraca maksymalną wartość, // jaką można // zmieścić w plecaku o // pojemności W static int knapSack(int W, int[] wt, int[] val, int n) { int i, w;  int[, ] K = nowy int[n + 1, W + 1];  // Zbuduj tabelę K[][] w dół // w górę dla (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) ? za: b;  } // Zwraca maksymalną wartość, // jaką można // zmieścić w plecaku o pojemności W funkcja knapSack(W, wt, val, n) { let i, w;  niech K = nowa tablica (n + 1);    // Zbuduj tabelę K[][] od dołu do góry dla (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. ?>>

Wyjście Złożoność czasowa: O(N * W). gdzie „N” to liczba elementów, a „W” to pojemność.
Przestrzeń pomocnicza: O(N * W). Zastosowanie tablicy 2-D o rozmiarze „N*W”.

Podejście zoptymalizowane pod kątem przestrzeni dla problemu plecakowego 0/1 przy użyciu programowania dynamicznego:

Aby rozwiązać problem, postępuj zgodnie z poniższym pomysłem:

Do obliczenia bieżącego wiersza tablicy dp[] potrzebujemy tylko poprzedniego wiersza, ale jeśli zaczniemy przemierzać wiersze od prawej do lewej, będzie można to zrobić tylko z jednym wierszem

Poniżej implementacja powyższego podejścia:

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; }>
Jawa
// 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>
Pyton
# 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>

Wyjście
220>

Złożoność czasu : O(N * W). Ponieważ unika się zbędnych obliczeń stanów
Przestrzeń pomocnicza : O(W) Ponieważ używamy tablicy 1-D zamiast tablicy 2-D