Prezentacja multimedialna
Ciągły problem plecakowy
Ciągły problem plecakowy to taki wariant problemu plecakowego, w którym możemy pakować do plecaka fragmenty (części) przedmiotów.
W tej sekcji przedstawimy, w jaki sposób rozwiązać ciągły problem plecakowy, wykorzystując algorytm zachłanny.
Zapoznajmy się z tym, jaki sposób działa algorytm, analizując podane dane:
maksymalna pojemność plecaka wynosi 37;
możemy pakować części przedmiotów, ale do dyspozycji jest tylko po jednej sztuce przedmiotu każdego rodzaju;
przedmioty, które mamy do dyspozycji, mają następujące wartości oraz wagi:
Przedmiot – | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|---|
Nazwa | akwamaryn | beryl | chalcedon | diament | eudialit | fluoryt | granat |
Wartość | 12 | 18 | 6 | 9 | 7 | 3 | 5 |
Waga | 5 | 9 | 12 | 4 | 21 | 7 | 6 |
Zaczniemy od obliczenia ilorazów wartości i wag. W przypadku zaprezentowanego przykładu te ilorazy to: 12/5, 9/4, 18/9, 5/6, 6/12, 3/7, 7/21.
Daje to następującą kolejność posortowanych nierosnąco przedmiotów: akwamaryn, diament, beryl, granat, chalcedon, fluoryt, eudialit (indeksy: 0, 3, 1, 6, 2, 5, 4).
Dla każdego posortowanego przedmiotu sprawdzamy, czy można go spakować w całości, a jeśli nie, to w jakiej części.
Wybieramy pierwszy przedmiot. To akwamaryn, którego waga to 5. Jego waga jest mniejsza od pojemności plecaka, zatem możemy spakować ten przedmiot. Pojemność plecaka po spakowaniu tego przedmiotu wynosi 32.
Waga kolejnego przedmiotu (diamentu) wynosi 4, zatem można spakować ten przedmiot. Pojemność plecaka po jego spakowaniu to 28.
Kolejnym przedmiotem jest beryl. Waga tego przedmiotu to 9. Jest mniejsza od pojemności plecaka, zatem zostaje zapakowany. Pozostała pojemność plecaka wynosi 19.
Kolejnym przedmiotem jest granat, który waży 6. Może zostać zapakowany, a pojemność plecaka po jego zapakowaniu wynosi 13.
Następny przedmiot, chalcedon, waży 12. Waga jest mniejsza od pojemności plecaka, zatem chalcedon może zostać zapakowany w całości. Pozostała pojemność plecaka to 1.
Waga fluorytu, następnego przedmiotu, wynosi 7. Jest większa od tego, jaka jest pozostała pojemność plecaka, zatem nie można go spakować w całości.
Należy zatem obliczyć, jaką część można spakować. By to zrobić, dzielimy pozostałą pojemność plecaka przez wagę przedmiotu. Wynik to 1/7. By obliczyć, jaką wartość ma zapakowana część przedmiotu, uzyskany wynik mnożymy przez wartość całego przedmiotu.
Uzyskana wartość to 3 × 1/7, co daje 3/7. Po zaokrągleniu do trzeciego miejsca po przecinku wynik wynosi 0,429.
Wypełniliśmy tym samym całe miejsce w plecaku.
Obliczmy całkowitą wartość spakowanych przedmiotów:
akwamaryn: 12diament: 9beryl: 18granat: 5chalcedon: 6fluoryt: 0,429
Całkowita wartość spakowanych przedmiotów wynosi 50,429. Wykorzystaliśmy całe miejsce.
Zapisz program, który rozwiąże ciągły problem plecakowy. Do dyspozycji masz po jednej sztuce każdego przedmiotu.
Wynik zaokrąglij do trzech miejsc po przecinku.
Specyfikacja problemu:
Dane:
nazwy– tablica łańcuchów znaków; nazwy poszczególnych przedmiotówwartości– tablica liczb naturalnych; wartości poszczególnych przedmiotówwagi– tablica liczb naturalnych; wagi poszczególnych przedmiotówn– liczba naturalna; liczba rodzajów przedmiotówpojemność– liczba naturalna; maksymalna pojemność plecaka
Wynik:
spakowane przedmioty (w całości lub części), których całkowita waga nie przekracza wartości przechowywanej w zmiennej
pojemność, a których całkowita wartość jest największa wśród możliwych wypełnień plecaka rzeczami o takiej wadze, która nie przekracza wartości zmiennejpojemność; pakujemy po jednej sztuce przedmiotu każdego rodzajucałkowita wartość spakowanego plecaka zaokrąglona do trzech miejsc po przecinku
W rozwiązaniu wykorzystujemy funkcję zaokr_do_trzech_miejsc, której zadaniem jest zaokrąglenie przekazanego do niej argumentu do trzech miejsc po przecinku.
Zapoznaj się z prezentacją przedstawiającą rozwiązanie ciągłego problemu plecakowego.