logo

0/1 Problém s batohem

Předpoklady: Úvod do problematiky batohu, jeho typy a jak je řešit

Dáno N položky, kde každá položka má nějakou váhu a zisk s ní spojenou a je také daná taška s kapacitou V , [t.j. vak pojme nanejvýš V hmotnost v něm]. Úkolem je vložit předměty do tašky tak, aby součet zisků s nimi spojených byl maximální možný.

Poznámka: Omezení je v tom, že můžeme předmět buď vložit zcela do tašky, nebo ji nelze vložit vůbec [Není možné vložit část předmětu do tašky].



Příklady:

Vstup: N = 3, W = 4, zisk[] = {1, 2, 3}, hmotnost[] = {4, 5, 1}
Výstup: 3
Vysvětlení: Existují dvě položky, které mají váhu menší nebo rovnou 4. Pokud vybereme položku s váhou 4, možný zisk je 1. A pokud vybereme položku s váhou 1, možný zisk je 3. Takže maximální možný zisk je 3. Všimněte si, že nemůžeme dát dohromady položky s hmotností 4 a 1, protože kapacita tašky je 4.

Vstup: N = 3, W = 3, zisk[] = {1, 2, 3}, hmotnost[] = {4, 5, 6}
Výstup: 0

Doporučený postup 0 – 1 Problém s batohem Vyzkoušejte!

Rekurzní přístup pro problém batohu 0/1:

Chcete-li problém vyřešit, postupujte podle níže uvedené myšlenky:

Jednoduchým řešením je zvážit všechny podmnožiny položek a vypočítat celkovou váhu a zisk všech podmnožin. Zvažte jediné podmnožiny, jejichž celková hmotnost je menší než W. Ze všech takových podmnožin vyberte podmnožinu s maximálním ziskem.

java jak převést řetězec na int

Optimální spodní konstrukce : Chcete-li vzít v úvahu všechny podmnožiny položek, mohou existovat dva případy pro každou položku.

  • Případ 1: Položka je zahrnuta do optimální podmnožiny.
  • Případ 2: Položka není součástí optimální sady.

Chcete-li problém vyřešit, postupujte podle následujících kroků:

Maximální hodnota získaná z „N“ položek je max. z následujících dvou hodnot.

  • Případ 1 (včetně Nčtpoložka): Hodnota Nčtpoložka plus maximální hodnota získaná ze zbývajících N-1 položek a zbývající hmotnosti, tj. (W-váha Nčtpoložka).
  • Případ 2 (vyjma Nčtpoložka): Maximální hodnota získaná N-1 položkami a hmotností W.
  • Pokud hmotnost „Nčt‘ položka je větší než ‘W’, pak N-tou položku nelze zahrnout a Případ 2 je jediná možnost.

Níže je uvedena implementace výše uvedeného přístupu:

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; } // Vrátí maximální hodnotu, kterou // lze vložit do batohu o kapacitě W int knapSack(int W, int wt[], int val[], int n) // Základní případ if (n == 0 // Kód ovladače int main() { int zisk[] = { 60, 100, 120 }; int váha[] = { 10, 20, 30 } int W = 50; 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; } // Vrátí maximální hodnotu, kterou lze // vložit do batohu o kapacitě W int knapSack(int W, int wt[], int val[], int n) W == 0) return 0;  // Pokud je hmotnost n-té položky větší než // Kapacita batohu W, pak tato položka nemůže // být zahrnuta do optimálního řešení, pokud (wt[n - 1]> W) return knapSack(W, wt, val, n - 1);  // Vrátí maximum ze dvou případů: // (1) zahrnuta n-tá položka // (2) nezahrnuta, jinak return max( val[n - 1] + knapSack(W - wt[n - 1], wt, val, n - 1), knapSack (W, hmotnost, val, n - 1));  // Kód ovladače int main() { int zisk[] = { 60, 100, 120 };  int váha[] = { 10, 20, 30 };  int W = 50;  int n = velikost(zisk) / velikost(zisk[0]);  printf('%d', knapSack(W, hmotnost, zisk, n));  návrat 0; }>
Jáva
/* 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; } // Vrátí maximální hodnotu, kterou // lze vložit do batohu o // kapacitě W static int knapSack(int W, int wt[], int val[], int n) // Kód ovladače public static void main( String args[]) { int zisk[] = new int[] { 60, 100, 120 };  int váha[] = new int[] { 10, 20, 30 };  int W = 50;  int n = zisk.délka;  System.out.println(knapSack(W, hmotnost, zisk, n));  } } /*Tento kód přispěl Rajat Mishra */>
Krajta
# 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) # return maximum dvou případů: # (1) n-tá položka zahrnuta # (2) nezahrnuta else: return max( val[n-1] + knapSack ( W-wt[n-1], wt, val, n-1), knapSack(W, wt, val, n-1)) # konec funkce knapSack # Kód řidiče if __name__ == '__main__': zisk = [60, 100, 120] hmotnost = [10, 20, 30] W = 50 n = len(zisk) print knapSack(W, hmotnost, zisk, n) # Tento kód přispěl 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; } // Vrátí maximální hodnotu, kterou // lze vložit do batohu o kapacitě W static int knapSack(int W, int[] wt, int[] val, int n) W == 0) return 0;  // Je-li hmotnost n-té položky // větší než kapacita batohu W, // pak tato položka nemůže být // zahrnuta do optimálního řešení if (wt[n - 1]> W) return knapSack(W, wt, val n-1);  // Vrátí maximum ze dvou případů: // (1) zahrnuta n-tá položka // (2) nezahrnuta, jinak return max(val[n - 1] + knapSack(W - wt[n - 1], wt, val, n - 1), knapSack (W, hmotnost, val, n - 1));    // Kód ovladače public static void Main() { int[] zisk = new int[] { 60, 100, 120 };  int[] váha = new int[] { 10, 20, 30 };  int W = 50;  int n = zisk.Délka;  Console.WriteLine(knapSack(W, hmotnost, zisk, n));  } } // Tento kód přispěl 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;  } // Vrátí maximální hodnotu, kterou // lze vložit do batohu o kapacitě W funkce knapSack(W, wt, val, n) // Základní případ if (n == 0 let profit = [ 60, 100, 120 ] nech vaha = [ 10, 20, 30 ] nech n = zisk.delka.log(W, vaha, zisk, n));PHP220>

Časová náročnost: O(2N)
Pomocný prostor: O(N), prostor zásobníku potřebný pro rekurzi

Přístup dynamického programování pro problém batohu 0/1

Přístup k zapamatování pro problém batohu 0/1:

Poznámka: Je třeba poznamenat, že výše uvedená funkce pomocí rekurze počítá znovu a znovu stejné dílčí problémy. Viz následující strom rekurze, K(1, 1) se vyhodnocuje dvakrát.

V následujícím stromu rekurze K() odkazuje na knapSack(). Dva parametry uvedené v následujícím stromu rekurze jsou n a W.
Strom rekurze je pro následující vzorové vstupy.
váha[] = {1, 1, 1}, W = 2, zisk[] = {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)

Rekurzivní strom pro kapacitu batohu 2 jednotky a 3 položky o hmotnosti 1 jednotky.

Protože se stále znovu opakuje stejný dílčí problém, můžeme k vyřešení problému implementovat následující myšlenku.

Pokud dostaneme podproblém poprvé, můžeme tento problém vyřešit vytvořením 2-D pole, které může uložit konkrétní stav (n, w). Nyní, pokud znovu narazíme na stejný stav (n, w), místo toho, abychom jej počítali v exponenciální složitosti, můžeme přímo vrátit jeho výsledek uložený v tabulce v konstantním čase.

vypsat řetězec java

Níže je uvedena implementace výše uvedeného přístupu:

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) { // Uložení hodnoty volání funkce // zásobníku do tabulky před návratem dp[index][W] = knapSackRec(W, wt, val, index - 1, dp);  return dp[index][W];  } else { // Uložení hodnoty do tabulky před návratem dp[index][W] = max(val[index] + knapSackRec(W - wt[index], wt, val, index - 1, dp), knapSackRec(W , hmotn., val, index - 1, dp));  // Návratová hodnota tabulky po uložení return dp[index][W];  } } int knapSack(int W, int wt[], int val[], int n) { // dvojitý ukazatel pro dynamickou deklaraci // tabulky int** dp;  dp = new int*[n];  // smyčka pro dynamické vytvoření tabulky pro (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; }>
Jáva
// 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; } // Vrátí hodnotu maximálního zisku 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) // Uložení hodnoty volání funkce // zásobník do tabulky před návratem return dp[n][W] = knapSackRec(W, wt, val, n - 1, dp);  else // Návratová hodnota tabulky po uložení return dp[n][W] = max((val[n - 1] + knapSackRec(W - wt[n - 1], hm, val, n - 1, dp)) , knapSackRec(W, hmotn., val, n - 1, dp));    static int knapSack(int W, int wt[], int val[], int N) { // Dynamicky deklarovat tabulku int dp[][] = new int[N + 1][W + 1];  // Smyčka pro počáteční vyplnění // tabulky hodnotou -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>
Krajta
# 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] = batoh(hmotnost, hodnota, W, n-1) návrat t[n][W] # Kód řidiče, pokud __name__ == '__main__': zisk = [60, 100, 120] váha = [10, 20, 30] W = 50 n = len(zisk) # Matici nejprve inicializujeme s -1. t = [[-1 pro i v rozsahu(W + 1)] pro j v rozsahu(n + 1)] print(knapsack(hmotnost, zisk, W, n)) # Tento kód přispěl Prosun Kumar Sarkar>'>C# 
// A utility function that returns // maximum of two integers  function max(a, b)  {   return (a>b) ? a: b;  } // Vrátí hodnotu funkce maximálního zisku knapSackRec(W, wt, val, n,dp) // Základní podmínka if (n == 0 funkce knapSack( W, wt,val,N) { // Deklarujte tabulku dp dynamicky // Inicializace dp tabulek (řádek a sloupců) s -1 pod var dp = new Array(N+1).fill(-1).map(el => new Array(W+1).fill(-1) ); návrat knapSackRec(W, hm, val, N, dp) var zisk= [ 60, 100, 120 ]; ; console.log(knapSack(W, váha, zisk, N));  
Výstup
220>

Časová náročnost: O(N * W). Protože se vyhneme nadbytečným výpočtům stavů.
Pomocný prostor: O(N * W) + O(N). Použití 2D datové struktury pole pro ukládání mezistavů a ​​O(N) pomocného zásobníku (ASS) bylo použito pro rekurzivní zásobník

Přístup zdola nahoru pro problém batohu 0/1:

Chcete-li problém vyřešit, postupujte podle níže uvedené myšlenky:

Protože se dílčí problémy vyhodnocují znovu, má tento problém vlastnost Překrývající se dílčí problémy. Takže problém batohu 0/1 má obě vlastnosti (viz tento a tento ) problému dynamického programování. Stejně jako ostatní typické Problémy dynamického programování (DP). , opětovnému výpočtu stejných dílčích problémů se lze vyhnout vytvořením dočasného pole K[][] způsobem zdola nahoru.

Ilustrace:

Níže je ilustrace výše uvedeného přístupu:

Nechat, hmotnost[] = {1, 2, 3}, zisk[] = {10, 15, 40}, kapacita = 6

  • Pokud není vyplněn žádný prvek, je možný zisk 0.
hmotnost⇢
položka⇣/
0123456
00000000
1
2
3
  • Pro vyplnění první položky v sáčku: Pokud dodržíme výše uvedený postup, bude tabulka vypadat následovně.
hmotnost⇢
položka⇣/
0123456
00000000
10101010101010
2
3
  • Pro vyplnění druhé položky:
    Když jthWeight = 2, pak maximální možný zisk je max (10, DP[1][2-2] + 15) = max(10, 15) = 15.
    Když jthWeight = 3, pak maximální možný zisk je max(2 nevloží, 2 se vloží do pytle) = max(DP[1][3], 15+DP[1][3-2]) = max(10, 25) = 25.
hmotnost⇢
položka⇣/
0123456
00000000
10101010101010
2010patnáct25252525
3
  • Pro vyplnění třetí položky:
    Když jthWeight = 3, maximální možný zisk je max(DP[2][3], 40+DP[2][3-3]) = max(25, 40) = 40.
    Když jthWeight = 4, maximální možný zisk je max(DP[2][4], 40+DP[2][4-3]) = max(25, 50) = 50.
    Když jthWeight = 5, maximální možný zisk je max(DP[2][5], 40+DP[2][5-3]) = max(25, 55) = 55.
    Když jthWeight = 6, maximální možný zisk je max(DP[2][6], 40+DP[2][6-3]) = max(25, 65) = 65.
hmotnost⇢
položka⇣/
0123456
00000000
10101010101010
2010patnáct25252525
3010patnáct40padesáti5565

Níže je uvedena implementace výše uvedeného přístupu:

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; } // Vrátí maximální hodnotu, kterou // lze vložit do batohu o kapacitě W int knapSack(int W, int wt[], int val[], int n) { int i, w;  vektor> K(n + 1, vektor (W + 1));  // Sestavení tabulky K[][] způsobem zdola nahoru pro (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; } // Vrátí maximální hodnotu, kterou // lze vložit do batohu o kapacitě W int knapSack(int W, int wt[], int val[], int n) { int i, w;  int K[n + 1][W + 1];  // Sestavení tabulky K[][] způsobem zdola nahoru pro (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; }>
Jáva
// 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; } // Vrátí maximální hodnotu, kterou // lze vložit do batohu o kapacitě W static int knapSack(int W, int wt[], int val[], int n) { int i, w;  int K[][] = nové int[n + 1][W + 1];  // Sestavení tabulky K[][] způsobem zdola nahoru pro (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 */>
Krajta
# 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; } // Vrátí maximální hodnotu, kterou // lze vložit do batohu o // kapacitě W static int knapSack(int W, int[] wt, int[] val, int n) { int i, w;  int[, ] K = nový int[n + 1, W + 1];  // Sestavení tabulky K[][] zdola // nahoru způsobem pro (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;  } // Vrátí maximální hodnotu, kterou lze // vložit do batohu o kapacitě W function knapSack(W, wt, val, n) { let i, w;  nechť K = new Array(n + 1);    // Sestavení tabulky K[][] způsobem zdola nahoru pro (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. ?>>

Výstup Časová náročnost: O(N * W). kde „N“ je počet prvků a „W“ je kapacita.
Pomocný prostor: O(N * W). Použití 2-D pole velikosti „N*W“.

Prostorově optimalizovaný přístup pro problém s batohem 0/1 pomocí dynamického programování:

Chcete-li problém vyřešit, postupujte podle níže uvedené myšlenky:

řetězec do int java

Pro výpočet aktuálního řádku pole dp[] potřebujeme pouze předchozí řádek, ale pokud začneme procházet řádky zprava doleva, lze to provést pouze s jedním řádkem

Níže je uvedena implementace výše uvedeného přístupu:

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; }>
Jáva
// 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>
Krajta
# 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>

Výstup
220>

Časová složitost : O(N * W). Protože se vyhneme nadbytečným výpočtům stavů
Pomocný prostor : O(W) Protože používáme 1-D pole místo 2-D pole