1340 - Rucsac

From Bitnami MediaWiki
Revision as of 17:09, 13 December 2023 by Andrada378 (talk | contribs)

Cerinta: Într-un magazin sunt n obiecte; pentru fiecare se cunoaște greutatea G și valoarea V. Un hoț intră în magazin având un rucsac ce poate transporta o greutate maximă GMax. El va fura anumite obiecte, sau porțiuni de obiecte, astfel încât suma greutăților obiectelor furate să nu depășească GMax.

Să se stabilească câștigul maxim pe care îl poate obține hoțul. Câștigul este egal cu suma valorilor obiectelor furate. Câștigul adus de o fracțiune de obiect este direct proporțional cu greutatea fracțiunii. Date de intrare Programul citește de la tastatură numerele naturale n GMax, iar apoi n perechi de valori naturale G V, reprezentând greutatea, respectiv valoarea fiecărui obiect. Date de iesire Programul va afișa pe ecran numărul C, reprezentând câștigul maxim pe care îl poate obține hoțul.

Rezolvare

def maximized_profit(n, GMax, obiecte):
    dp = [0] * (GMax + 1)

    for i in range(1, n + 1):
        for j in range(GMax, 0, -1):
            if obiecte[i - 1][0] <= j:
                dp[j] = max(dp[j], dp[j - obiecte[i - 1][0]] + obiecte[i - 1][1] * (obiecte[i - 1][0] / obiecte[i - 1][0]))

    return dp[GMax]

# Citirea datelor de la tastatură
n = int(input("Introdu numărul de obiecte: "))
GMax = int(input("Introdu greutatea maximă ce poate fi transportată: "))

obiecte = []
print("Introdu greutatea și valoarea pentru fiecare obiect:")
for i in range(n):
    G, V = map(int, input().split())
    obiecte.append((G, V))

max_profit = maximized_profit(n, GMax, obiecte)
print(max_profit)