Predpoklady: Úvod do problematiky batohu, jeho typy a ako ich riešiť
Dané N položky, kde každá položka má určitú váhu a zisk s ňou spojenú a tiež má tašku s kapacitou IN , [t.j. taška pojme nanajvýš IN hmotnosť v ňom]. Úlohou je vložiť veci do tašky tak, aby súčet ziskov s nimi spojených bol maximálny možný.
Poznámka: Obmedzenie je v tom, že položku môžeme buď úplne vložiť do tašky, alebo ju nemôžeme vložiť vôbec [Nie je možné vložiť časť položky do tašky].
Príklady:
Odporúčaný postup 0 – 1 Problém s batohom Skúste to!Vstup: N = 3, W = 4, zisk[] = {1, 2, 3}, hmotnosť[] = {4, 5, 1}
Výkon: 3
Vysvetlenie: Existujú dve položky, ktoré majú váhu menšiu alebo rovnú 4. Ak vyberieme položku s váhou 4, možný zisk je 1. A ak vyberieme položku s váhou 1, možný zisk je 3. Takže maximálny možný zisk je 3. Upozorňujeme, že nemôžeme dať dohromady položky s hmotnosťou 4 a 1, pretože kapacita tašky je 4.
Vstup: N = 3, W = 3, zisk[] = {1, 2, 3}, hmotnosť[] = {4, 5, 6}
Výkon: 0
Rekurzný prístup pre problém s batohom 0/1:
Ak chcete problém vyriešiť, postupujte podľa nasledujúcej myšlienky:
Jednoduchým riešením je zvážiť všetky podmnožiny položiek a vypočítať celkovú hmotnosť a zisk všetkých podmnožín. Zvážte jediné podmnožiny, ktorých celková hmotnosť je menšia ako W. Zo všetkých takýchto podmnožín vyberte podmnožinu s maximálnym ziskom.
javascript pre rozbaľovaciu ponukuOptimálna spodná konštrukcia : Na zohľadnenie všetkých podmnožín položiek môžu existovať dva prípady pre každú položku.
- Prípad 1: Položka je zahrnutá do optimálnej podmnožiny.
- Prípad 2: Položka nie je súčasťou optimálnej sady.
Na vyriešenie problému postupujte podľa nasledujúcich krokov:
Maximálna hodnota získaná z „N“ položiek je maximálna z nasledujúcich dvoch hodnôt.
- Prípad 1 (vrátane čísla Nthpoložka): Hodnota Nthpoložka plus maximálna hodnota získaná zo zostávajúcich N-1 položiek a zostávajúcej hmotnosti, t. j. (W-váha Nthpoložka).
- Prípad 2 (okrem Nthpoložka): Maximálna hodnota získaná N-1 položkami a hmotnosťou W.
- Ak hmotnosť „Nth‘ položka je väčšia ako ‘W’, potom N-tá položka nemôže byť zahrnutá a Prípad 2 je jediná možnosť.
Nižšie je uvedená implementácia vyššie uvedeného prí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áti maximálnu hodnotu, ktorú // možno vložiť do batohu s kapacitou W int knapSack(int W, int wt[], int val[], int n) // Základný prípad if (n == 0 // Kód ovládača int main() { int zisk[] = { 60, 100, 120 }; int vaha[] = { 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áti maximálnu hodnotu, ktorú je možné // vložiť do batohu s kapacitou W int knapSack(int W, int wt[], int val[], int n) W == 0) return 0; // Ak je hmotnosť n-tej položky väčšia ako // Kapacita batohu W, potom túto položku nemožno // zaradiť do optimálneho riešenia, ak (wt[n - 1]> W) vráti batoh(W, hm, val, n - 1); // Vráti maximálne dva prípady: // (1) zahrnutá n-tá položka // (2) nezahrnutá else return max( val[n - 1] + knapSack(W - wt[n - 1], wt, val, n - 1), knapSack (W, hmotn., val, n - 1)); // Kód ovládača int main() { int zisk[] = { 60, 100, 120 }; int váha[] = { 10, 20, 30 }; int W = 50; int n = veľkosť(zisk) / veľkosť(zisk[0]); printf('%d', knapSack(W, hmotnosť, zisk, n)); návrat 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; } // Vráti maximálnu hodnotu, ktorú // možno vložiť do batohu s // kapacitou W static int knapSack(int W, int wt[], int val[], int n) // Kód ovládača 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ĺžka; System.out.println(knapSack(W, hmotnosť, zisk, n)); } } /*Tento kód prispel 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) # return maximum dvoch prípadov: # (1) zahrnutá n-tá položka # (2) nezahrnutá else: return max( val[n-1] + knapSack ( W-wt[n-1], wt, val, n-1), knapSack(W, wt, val, n-1)) # koniec funkcie knapSack # Kód vodiča, ak __name__ == '__main__': zisk = [60, 100, 120] hmotnosť = [10, 20, 30] W = 50 n = len(zisk) print knapSack(W, hmotnosť, zisk, n) # Tento kód prispel 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áti maximálnu hodnotu, ktorú // možno vložiť do batohu s kapacitou W static int knapSack(int W, int[] wt, int[] val, int n) W == 0) return 0; // Ak je hmotnosť n-tej položky // väčšia ako kapacita batohu W, // potom táto položka nemôže byť // zahrnutá do optimálneho riešenia if (wt[n - 1]> W) return knapSack(W, wt, val n-1); // Vráti maximálne dva prípady: // (1) zahrnutá n-tá položka // (2) nezahrnutá else return max(val[n - 1] + knapSack(W - wt[n - 1], wt, val, n - 1), knapSack (W, hmotn., val, n - 1)); // Kód ovládača 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ĺžka; Console.WriteLine(knapSack(W, hmotnosť, zisk, n)); } } // Tento kód prispel 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áti maximálnu hodnotu, ktorú // možno vložiť do batohu s kapacitou W funkcia knapSack(W, wt, val, n) // Základný prípad if (n == 0 nech profit = [ 60, 100, 120 ] nech vaha = [ 10, 20, 30 ] nech n = zisk.dlzka.log(W, vaha, zisk, n));PHP220> Časová zložitosť: O(2N)
Pomocný priestor: O(N), Priestor zásobníka potrebný na rekurziu
Dynamický programovací prístup pre problém s batohom 0/1
Memorizačný prístup pre 0/1 problém s batohom:
Poznámka: Treba poznamenať, že vyššie uvedená funkcia pomocou rekurzie počíta znova a znova rovnaké čiastkové problémy. Pozrite si nasledujúci strom rekurzie, K(1, 1) sa vyhodnocuje dvakrát.
V nasledujúcom strome rekurzie K() odkazuje na knapSack(). Dva parametre uvedené v nasledujúcom strome rekurzie sú n a W.
Strom rekurzie je určený pre nasledujúce vzorové vstupy.
hmotnosť[] = {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)
Rekurzný strom pre batoh s kapacitou 2 jednotky a 3 položky s hmotnosťou 1 jednotky.
Keďže sa rovnaký podproblém znova a znova opakuje, môžeme na vyriešenie problému implementovať nasledujúcu myšlienku.
Ak dostaneme podproblém prvýkrát, môžeme tento problém vyriešiť vytvorením 2-D poľa, ktoré môže uložiť konkrétny stav (n, w). Ak teraz opäť narazíme na rovnaký stav (n, w), namiesto toho, aby sme ho vypočítali v exponenciálnej zložitosti, môžeme priamo vrátiť jeho výsledok uložený v tabuľke v konštantnom čase.
matematická trieda java
Nižšie je uvedená implementácia vyššie uvedeného prí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ženie hodnoty volania funkcie // zásobníka do tabuľky pred návratom dp[index][W] = knapSackRec(W, wt, val, index - 1, dp); return dp[index][W]; } else { // Uloženie hodnoty do tabuľky pred návratom 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 tabuľky po uložení return dp[index][W]; } } int knapSack(int W, int wt[], int val[], int n) { // dvojitý ukazovateľ na dynamickú deklaráciu // tabuľky int** dp; dp = new int*[n]; // slučka na dynamické vytvorenie tabuľky pre (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; } // Vráti hodnotu maximálneho 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ženie hodnoty volania funkcie // zásobník do tabuľky pred návratom return dp[n][W] = knapSackRec(W, wt, val, n - 1, dp); else // Návratová hodnota tabuľky po uložení return dp[n][W] = max((val[n - 1] + knapSackRec(W - wt[n - 1], wt, val, n - 1, dp)) , knapSackRec (W, hmotn., val, n - 1, dp)); static int knapSack(int W, int wt[], int val[], int N) { // Dynamicky deklaruj tabuľku int dp[][] = new int[N + 1][W + 1]; // Slučka na počiatočné vyplnenie // tabuľky 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> 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] = batoh(hmotnosť, hodnota, W, n-1) návrat t[n][W] # Kód vodiča, ak __name__ == '__main__': zisk = [60, 100, 120] váha = [10, 20, 30] W = 50 n = len(zisk) # Maticu najprv inicializujeme s -1. t = [[-1 pre i v rozsahu (W + 1)] pre j v rozsahu (n + 1)] print(knapsack(hmotnosť, zisk, W, n)) # Tento kód prispel Prosun Kumar Sarkar>'>C# // A utility function that returns // maximum of two integers function max(a, b) { return (a>b) ? a: b; } // Vráti hodnotu funkcie maximálneho zisku knapSackRec(W, wt, val, n,dp) // Základná podmienka if (n == 0 function knapSack( W, wt,val,N) { // Deklarácia tabuľky dp dynamicky // Inicializácia dp tabuliek (riadok a stĺpcov) 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, hmotnosť, zisk, N));
Výkon 220>
Časová zložitosť: O(N * W). Keďže sa vyhýbame nadbytočným výpočtom stavov.
Pomocný priestor: 0(N*W) + 0(N). Použitie 2D dátovej štruktúry poľa na ukladanie medzistavov a pomocného zásobníkového priestoru (ASS) O(N) sa použilo na rekurzný zásobník.
Prístup zdola nahor pre problém s batohom 0/1:
Ak chcete problém vyriešiť, postupujte podľa nasledujúcej myšlienky:
Keďže podproblémy sa vyhodnocujú znova, tento problém má vlastnosť Prekrývajúce sa podproblémy. Takže problém batohu 0/1 má obe vlastnosti (pozri toto a toto ) problému dynamického programovania. Ako iné typické Problémy dynamického programovania (DP). , opätovnému výpočtu rovnakých čiastkových problémov sa možno vyhnúť vytvorením dočasného poľa K[][] spôsobom zdola nahor.
Ilustrácia:
Nižšie je ilustrácia vyššie uvedeného prístupu:
nech, hmotnosť[] = {1, 2, 3}, zisk[] = {10, 15, 40}, kapacita = 6
int do reťazca java
- Ak nie je vyplnený žiadny prvok, možný zisk je 0.
hmotnosť⇢
položka⇣/ 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 1 2 3
- Na naplnenie prvej položky vo vrecku: Ak dodržíme vyššie uvedený postup, tabuľka bude vyzerať nasledovne.
hmotnosť⇢
položka⇣/ 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
- Na vyplnenie druhej položky:
Keď jthWeight = 2, maximálny možný zisk je max (10, DP[1][2-2] + 15) = max(10, 15) = 15.
Keď jthWeight = 3, potom maximálny možný zisk je max(2 sa nevložia, 2 sa vložia do vrecka) = max(DP[1][3], 15+DP[1][3-2]) = max(10, 25) = 25.
hmotnosť⇢
položka⇣/ 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 pätnásť 25 25 25 25 3
- Na vyplnenie tretej položky:
Keď jthWeight = 3, maximálny možný zisk je max(DP[2][3], 40+DP[2][3-3]) = max(25, 40) = 40.
Keď jthWeight = 4, maximálny možný zisk je max(DP[2][4], 40+DP[2][4-3]) = max(25, 50) = 50.
Keď jthWeight = 5, maximálny možný zisk je max(DP[2][5], 40+DP[2][5-3]) = max(25, 55) = 55.
Keď jthWeight = 6, maximálny možný zisk je max(DP[2][6], 40+DP[2][6-3]) = max(25, 65) = 65.
hmotnosť⇢
položka⇣/ 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 pätnásť 25 25 25 25 3 0 10 pätnásť 40 päťdesiat 55 65
Nižšie je uvedená implementácia vyššie uvedeného prí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áti maximálnu hodnotu, ktorú // možno vložiť do batohu s kapacitou W int knapSack(int W, int wt[], int val[], int n) { int i, w; vektor> K(n + 1, vektor (W + 1)); // Zostavte tabuľku K[][] zdola nahor pre (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áti maximálnu hodnotu, ktorú // možno vložiť do batohu s kapacitou W int knapSack(int W, int wt[], int val[], int n) { int i, w; int K[n + 1][W + 1]; // Zostavte tabuľku K[][] zdola nahor pre (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; } // Vráti maximálnu hodnotu, ktorú // možno vložiť do batohu s kapacitou W static int knapSack(int W, int wt[], int val[], int n) { int i, w; int K[][] = nový int[n + 1][W + 1]; // Zostavte tabuľku K[][] zdola nahor pre (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; } // Vráti maximálnu hodnotu, ktorú // možno vložiť do batohu s // kapacitou W static int knapSack(int W, int[] wt, int[] val, int n) { int i, w; int[,] K = nový int[n + 1, W + 1]; // Zostavte tabuľku K[][] zdola // hore spôsobom pre (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áti maximálnu hodnotu, ktorú // možno vložiť do batohu s kapacitou W function knapSack(W, wt, val, n) { nech i, w; nech K = new Array(n + 1); // Zostavte tabuľku K[][] zdola nahor pre (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ýkon Časová zložitosť: O(N * W). kde „N“ je počet prvkov a „W“ je kapacita.
Pomocný priestor: O(N * W). Použitie 2-D poľa veľkosti „N*W“. Priestorovo optimalizovaný prístup pre problém s batohom 0/1 pomocou dynamického programovania:
Ak chcete problém vyriešiť, postupujte podľa nasledujúcej myšlienky:
Na výpočet aktuálneho riadku poľa dp[] potrebujeme iba predchádzajúci riadok, ale ak začneme prechádzať riadkami sprava doľava, dá sa to urobiť iba s jedným riadkom
Nižšie je uvedená implementácia vyššie uvedeného prí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; }> 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>
Výkon 220>
Časová zložitosť : O(N * W). Keďže sa vyhýbame nadbytočným výpočtom stavov
Pomocný priestor : O(W) Keďže používame 1-D pole namiesto 2-D poľa