Decyzyjny problem plecakowy to przypadek problemu plecakowego, który polega na zmaksymalizowaniu wartości plecaka C bez przekraczania maksymalnej wagi W. W odróżnieniu od ogólnego przypadku każdy wymieniony przedmiot można spakować tylko raz. Jednak jeśli przedmiot występuje na liście n razy to n razy można go spakować. Zadanie to najlepiej odwzorowuje rzeczywistość.
Tak samo jak podczas ogólnego problemu plecakowego należy posortować dane według ilorazu ceny Ci do Wi. Następnie należy zacząć dokładać elementy najbardziej opłacalne. Przedmiot jest dokładany wtedy i tylko wtedy, gdy jest dla niego miejsce w plecaku. Dla każdego przedmiotu po zakończeniu działania algorytmu powinno być określone czy jest zabierany czy nie. Złożoność takiego algorytmu zależy od wybranej metody sortowania o złożoności Θ(k) i wtedy złożoność algorytmu to Θ(n + k), gdzie n to ilość elementów. W najlepszym przypadku decyzyjny problem plecakowy ma złożoność Θ(n·log(n))
Przykładowo załóżmy, że maksymalnie można do plecaka włożyć W = 7kg. do spakowania są przedmioty w tabelce. Dla każdego z wymienionych przedmiotów wyliczmy iloraz Ci do Wi.
Przedmiot | Cena | Waga | Opłacalność (Ci / Wi) |
---|---|---|---|
1 | 10 | 2 | 5 |
2 | 6 | 3 | 2 |
3 | 2 | 4 | 0.5 |
4 | 3 | 5 | 0.6 |
5 | 3 | 1 | 3 |
6 | 1 | 1 | 1 |
Kolejny krok polega na posortowaniu listy według opłacalności:
Przedmiot | Cena | Waga | Opłacalność (Ci / Wi) |
---|---|---|---|
1 | 10 | 2 | 5 |
5 | 3 | 1 | 3 |
2 | 6 | 3 | 2 |
6 | 1 | 1 | 1 |
4 | 3 | 5 | 0.6 |
3 | 2 | 4 | 0.5 |
W ostatnim etapie należy określić, które przedmioty zostaną zabrane. Przedmioty są wybierane od tych najbardziej opłacalnych. Jeśli przedmiot można spakować to jest on dokładany do plecaka.
Przedmiot | Cena | Waga | Do zabrania? | Pozostały udźwig W' |
---|---|---|---|---|
1 | 10 | 2 | Tak | 7 - 2 = 5 |
5 | 3 | 1 | Tak | 5 - 1 = 4 |
2 | 6 | 3 | Tak | 4 - 3 = 1 |
6 | 1 | 1 | Tak | 1 - 1 = 0 |
4 | 3 | 5 | Nie | - |
3 | 2 | 4 | Nie | - |
Ostatnie dwa elementy nie muszą być już sprawdzane, ponieważ i tak nie zmieszczą się do plecaka. Ta drobna optymalizacja pozwoli zakończyć działanie algorytmu wcześniej. Wynikiem działania algorytmu jest zwrócenie, że do plecaka należy spakować przedmioty o numerach 1, 3, 5 i 6. Wartość plecaka C wyniesie 10 + 3 + 6 + 1 = 20.
Sortowanie danych zostało oparte na sortowaniu bąbelkowym. W tego typu sortowania należy pamiętać, że dane trzeba zmieniać w obydwu tablicach równocześnie, ponieważ są to nierozłączne pary wartości.
Pakowanie decyzyjne realizuje funkcja zapakujDecyzyjnie(), która przyjmuje cztery argumenty: p_waga - tablica wag przedmiotów, p_cena - tablica cen przedmiotów, n - ilość przedmiotów oraz U - maksymalny udźwig.
(2.) Po wczytaniu dane są sortowane. Następnie (3.) inicjalizowana jest zmienna do zliczania wartości plecaka. (4.) Dla każdego przedmiotu: (5.) sprawdź czy zmieści się do plecaka. Jeśli tak to (6.) dołóż go zmniejszając aktualny maksymalny udźwig U i (7.) zwiększ wartość plecaka. (8.) Sprawdź czy wartość plecaka nie osiągnęła 0. Jeśli tak to (9.) zakończ wcześniej działanie programu. (13.) Jeśli pętla nie zakończyła działania wcześniej to należy zwrócić W. Przypadek ten może wystąpić, gdy wciąż pozostało wolne miejsce, ale żaden przedmiot nie pasuje (pod względem wagowym).
Poniższa funkcja main() poprosi użytkownika o wprowadzenie ile będzie elementów oraz maksymalny udźwig. Następnie wczyta n linijek par danych cena × waga.
Napisz program dla handlowca, który trafił na bardzo dobre oferty. Chciałby, aby zakupione obiekty nie przekroczyły wagi U, ale ich wartość była jak największa. Pomóż handlowcowi wybrać ile jakich przedmiotów powinien zakupić. Na początku zostaną dane n - ilość ofert oraz U - maksymalny udźwig. Następnie zostanie podane n linijek danych postaci nazwa × cena × waga × ilość. Po zakończeniu działania algorytmu wypisz przedmioty do kupienia oraz w jakiej ilości.
Przykładowo zostaną podane następujące dane.
Program powinien wypisać na ekran: