Szukanie największego podzbioru przedmiotów, proporcje, programowanie dynamiczne

0

Witam

Mam duży problem z napisaniem pewnego algorytmu.

Chodzi o to, że mam sobie jakąś podaną na wejściu ilość przedmiotów, z których każdy zawiera w sobie 3 substancje(a,b,c). Substancje te mają różne masy(mogą być też zerowe, ale co najmniej jedna substancja musi coś ważyć).
Trzeba wybrać takie przedmioty, żeby substancje te były w proporcjach 11 dając jak najwięcej zsumowanej masy, przy użyciu jak najmniejszej ilości przedmiotów (jeśli maks. masę będzie można uzyskać na kilka sposobów). Należy podać jaka będzie masa całkowita tych wybranych przedmiotów oraz jaka będzie ich ilość.
Przykładowo:
kolejne przedmioty mają masy substancji:
a b c
1 2 3
1 1 1
1 0 0
1 1 0
2 1 0
Zatem przy użyciu 3 przedmiotów (pierwszy, drugi i piąty) otrzymamy maksymalną masę substancji w proporcjach 11, czyli 12(3x4).
Podobno najlepiej to zrealizować za pomocą programowania dynamicznego (bodajże algorytm plecakowy). Wiem mniej więcej na czym to polega, ale z tym zadaniem po prostu nie mogę sobie poradzić, siedzę już kilka godzin i nic nie wymyśliłem... :(
Ktoś ma jakiś pomysł, jak to ugryźć?
Pomocy! :D

P.S.
Byłoby miło jakby ewentualne kody były w C++, pozostałych języków nie ogarniam tak dobrze ^^.

2

Jaka złożoność Cię interesuje?

Łatwo rozwiązać to zadanie bruteforcem, czyli sprawdzając wszystkie podzbory danego zbioru i wybierając najelpszy (w sumie to jest python, ale miał być pseudokod):

elems = [
    (1, 2, 3),
    (1, 1, 1),
    (1, 0, 0),
    (1, 1, 0),
    (2, 1, 0),
]

def check(ndx, elems, used, a, b, c):
    if ndx == len(elems):
        if a == b == c:
            return (used, a + b + c)
        else:
            return (0, 0)
    else:
        x = elems[ndx]
        skip = check(ndx + 1, elems, used, a, b, c)
        use = check(ndx + 1, elems, used + 1, a + x[0], b + x[1], c + x[2])
        if skip[1] == use[1]:
            return skip if skip[0] < use[0] else use
        else:
            return skip if skip[1] > use[1] else use

print check(0, elems, 0, 0, 0, 0)

(Dla każdego elementu rozważamy dwa przypadki - podzbiór z nim i podzbiór bez niego)

Złożoność: O(2^n). Nie jest to powalająca szybkość, ale z drugiej strony zadanie wygląda na NP-trudne (nie sprawdzone).

1 użytkowników online, w tym zalogowanych: 0, gości: 1