problem z plecakiem

problem z plecakiem okazał się jednocześnie trudny i interesujący. Jestem pewien, że jeśli odwiedzasz tę stronę, znasz już instrukcję problemu, ale tylko ze względu na zakończenie:

Problem:

biorąc pod uwagę plecak o maksymalnej pojemności w I N elementów, każdy z własną wartością i wagą, Wrzuć przedmioty wewnątrz plecaka tak, że ostateczna zawartość ma maksymalną wartość. Rany !!,

oto ogólny sposób wyjaśnienia problemu – weź pod uwagę, że złodziej wchodzi do domu, aby okraść i nosi plecak. W domu jest stała liczba przedmiotów-każdy z własną wagą i wartością-Biżuteria, o mniejszej wadze i najwyższej wartości vs tabele, o mniejszej wartości, ale dużo ciężka. Aby dodać paliwo do ognia, złodziej ma Stary plecak, który ma ograniczoną pojemność. Oczywiście nie może podzielić stołu na pół lub biżuterię na 3/4., Albo go bierze, albo opuszcza

przykład :

Knapsack Max weight : W = 10 (units)Total items : N = 4Values of items : v = {10, 40, 30, 50}Weight of items : w = {5, 4, 6, 3}

pobieżne spojrzenie na przykładowe dane mówi nam, że maksymalna wartość, którą możemy pomieścić z limitem maksymalnej wagi 10, wynosi 50 + 40 = 90 z wagą 7.

podejście:

sposób, w jaki jest to optymalnie rozwiązywane, polega na wykorzystaniu programowania dynamicznego – rozwiązywanie dla mniejszych zestawów problemów plecakowych, a następnie rozszerzanie ich dla większego problemu.,

zbudujmy tablicę wagi elementu X o nazwie V (tablica wartości):

V = 4 rows * 10 columns

każda z wartości w tej macierzy reprezentuje mniejszy problem plecaka.

przypadek podstawowy 1 : weźmy przypadek 0.kolumny. Oznacza to tylko, że plecak ma 0 pojemności. Co możesz w nich trzymać? Nic. Tak więc, wypełnimy je wszystkie z 0s.

przypadek podstawowy 2: weźmy przypadek rzędu 0. Oznacza to tylko, że w domu nie ma żadnych przedmiotów. Co trzymasz w plecaku, jeśli nie ma przedmiotów. Znowu nic !!! Wszystkie zera.,

rozwiązanie:

1) teraz zacznijmy wypełniać wiersz tablicy. Co oznaczają wiersze 1 i Kolumna 1? Że biorąc pod uwagę pierwszy element (wiersz), można go pomieścić w plecaku o pojemności 1 (kolumna). Nie. Waga pierwszej pozycji to 5. Więc, wypełnimy 0. W rzeczywistości nie bylibyśmy w stanie wypełnić niczego, dopóki nie osiągniemy kolumny 5(Waga 5).

2) gdy osiągniemy kolumnę 5 (która reprezentuje wagę 5) w pierwszym rzędzie, oznacza to, że możemy pomieścić pozycję 1., Wypełnimy tam 10 (pamiętaj, że jest to tablica wartości):

3) przechodząc dalej, dla wagi 6 (kolumna 6), możemy pomieścić cokolwiek innego z pozostałą wagą 1 (Waga – Waga tego elementu => 6 – 5). Hej, pamiętaj, jesteśmy na pierwszym miejscu. Tak więc jest to trochę intuicyjne, że reszta wiersza będzie po prostu taka sama wartość, ponieważ nie jesteśmy w stanie dodać żadnego innego elementu dla tej dodatkowej wagi, którą mamy.,

4) tak więc następna interesująca rzecz dzieje się, gdy dotrzemy do kolumny 4 w trzecim rzędzie. Aktualna Masa eksploatacyjna wynosi 4.

powinniśmy sprawdzić następujące przypadki.

1) Czy możemy pomieścić punkt 2 – Tak, możemy. Waga punktu 2 wynosi 4.

2) czy wartość aktualnej wagi jest wyższa bez pozycji 2? – Sprawdź poprzedni wiersz dla tej samej wagi. Nie. poprzedni wiersz * ma w sobie 0, ponieważ nie byliśmy w stanie pomieścić pozycji 1 w wadze 4.

3) Czy możemy pomieścić dwa przedmioty o tej samej wadze, abyśmy mogli zmaksymalizować wartość? – Nie., Pozostała waga po odjęciu wagi Item2 wynosi 0.

Dlaczego poprzedni wiersz?

Po prostu dlatego, że poprzedni wiersz przy wadze 4 sam jest mniejszym rozwiązaniem knapsack, który daje maksymalną wartość, która może być zgromadzona dla tej wagi do tego punktu (przechodząc przez przedmioty).,

1) wartość bieżącej pozycji = 40

2) Waga bieżącej pozycji = 4

3) waga, która pozostała = 4 – 4 = 0

4) Sprawdź wiersz powyżej (pozycja powyżej w przypadku pozycji 1 lub skumulowana maksymalna wartość w przypadku reszty wierszy). Dla pozostałej wagi 0, czy jesteśmy w stanie pomieścić pozycję 1? Mówiąc najprościej, czy w powyższym wierszu jest jakaś wartość dla danej wagi?,

obliczenie wygląda tak:

1) Weź maksymalną wartość dla tej samej wagi bez tego elementu:

previous row, same weight = 0=> V

2) Weź wartość bieżącego elementu + wartość, którą możemy pomieścić z pozostałą wagą:

Max wśród tych dwóch wynosi 40 (0 i 40).

3) następne i najważniejsze zdarzenie ma miejsce w kolumnie 9 i wierszu 2. Czyli mamy wagę 9 i mamy dwie rzeczy. Patrząc na przykładowe dane możemy pomieścić dwie pierwsze pozycje., Tutaj rozważamy kilka rzeczy:

  1. wartość bieżącej pozycji = 40
  2. waga bieżącej pozycji = 4
  3. waga, która pozostała = 9 – 4 = 5
  4. Sprawdź wiersz powyżej. Przy pozostałej wadze 5, jesteśmy w stanie pomieścić punkt 1.

tak więc obliczenia są następujące :

1) Weź maksymalną wartość dla tej samej wagi bez tego elementu:

previous row, same weight = 10

2) Weź wartość bieżącego elementu + wartość, którą możemy zgromadzić z pozostałą wagą:

Value of current item (40)+ value in previous row with weight 5 (total weight until now (9) - weight of the current item (4))= 10

10 vs 50 = 50.,

pod koniec rozwiązywania tych wszystkich mniejszych problemów, wystarczy zwrócić wartość w V – Item 4 przy wadze 10:

złożoność

Analiza złożoności rozwiązania jest dość prosta. Po prostu mamy pętlę dla W W pętli N = > O (NW)

implementacja:

nadchodzi obowiązkowy kod implementacji w Javie:

Articles

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *