algorithm
Problem z plecakiem
Szukaj…
Uwagi
Problem plecakowy powstaje głównie w mechanizmach alokacji zasobów. Nazwę „Knapsack” po raz pierwszy wprowadził Tobias Dantzig .
Przestrzeń pomocnicza: O(nw)
Złożoność czasu O(nw)
Podstawy problemu z plecakiem
Problem : Biorąc pod uwagę zestaw przedmiotów, w których każdy element zawiera wagę i wartość, określ liczbę każdego z nich w kolekcji, aby całkowita waga była mniejsza lub równa określonemu limitowi, a całkowita wartość była tak duża, jak to możliwe .
Pseudo-kod problemu plecakowego
Dany:
- Wartości (tablica v)
- Masy (tablica w)
- Liczba odrębnych pozycji (n)
- Pojemność (W)
for j from 0 to W do:
m[0, j] := 0
for i from 1 to n do:
for j from 0 to W do:
if w[i] > j then:
m[i, j] := m[i-1, j]
else:
m[i, j] := max(m[i-1, j], m[i-1, j-w[i]] + v[i])
Prosta implementacja powyższego pseudo kodu przy użyciu Pythona:
def knapSack(W, wt, val, n):
K = [[0 for x in range(W+1)] for x in range(n+1)]
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]
val = [60, 100, 120]
wt = [10, 20, 30]
W = 50
n = len(val)
print(knapSack(W, wt, val, n))
Uruchamianie kodu: Zapisz to w pliku o nazwie knapSack.py
$ python knapSack.py
220
Złożoność czasowa powyższego kodu: O(nW)
gdzie n to liczba przedmiotów, a W to pojemność plecaka.
Rozwiązanie zaimplementowane w C #
public class KnapsackProblem
{
private static int Knapsack(int w, int[] weight, int[] value, int n)
{
int i;
int[,] k = new int[n + 1, w + 1];
for (i = 0; i <= n; i++)
{
int b;
for (b = 0; b <= w; b++)
{
if (i==0 || b==0)
{
k[i, b] = 0;
}
else if (weight[i - 1] <= b)
{
k[i, b] = Math.Max(value[i - 1] + k[i - 1, b - weight[i - 1]], k[i - 1, b]);
}
else
{
k[i, b] = k[i - 1, b];
}
}
}
return k[n, w];
}
public static int Main(int nItems, int[] weights, int[] values)
{
int n = values.Length;
return Knapsack(nItems, weights, values, n);
}
}
Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow