Ich möchte die Anzahl der Sterne bei einem bestimmten Budget und einer maximalen Begrenzung der Kombination maximieren.
Beispielfrage:
Mit einem Budget von 500 Euro, wenn Sie nur die maximal zulässigen Restaurants oder weniger besuchen, speisen und sammeln Sie die meisten Sterne, die möglich sind.
Ich möchte einen effizienten Algorithmus schreiben, der möglicherweise 1 Million Restaurantinstanzen für maximal 10 Restaurants verarbeiten kann.
Beachten Sie, dass dies ein Kreuzbeitrag aus einer Frage ist, die ich gestern gestellt habe: Java: Holen Sie sich die effizienteste Kombination einer großen Liste von Objekten basierend auf einem Feld
Die folgende Lösung weist dem r8
Restaurant 15 $ pro Stern zu , was bedeutet, dass beim Generieren der Liste diese zuerst in die Liste aufgenommen werden und mit den verbleibenden 70 $ nur 2 weitere Sterne erhalten werden, was insgesamt 4 Sterne ergibt. Wenn es jedoch klug genug wäre, das r8
Restaurant zu überspringen (obwohl es das beste Verhältnis von Dollar zu Stern ist), wäre das r1
Restaurant tatsächlich eine bessere Wahl für das Budget, da es 100 $ kostet und 5 Sterne kostet.
Kann jemand helfen, das Problem zu versuchen und die aktuelle Lösung zu schlagen?
import itertools
class Restaurant():
def __init__(self, cost, stars):
self.cost = cost
self.stars = stars
self.ratio = cost / stars
def display(self):
print("Cost: $" + str(self.cost))
print("Stars: " + str(self.stars))
print()
r1 = Restaurant(100, 5)
r2 = Restaurant(140, 3)
r3 = Restaurant(90, 4)
r4 = Restaurant(140, 3)
r5 = Restaurant(120, 4)
r6 = Restaurant(60, 1)
r7 = Restaurant(40, 1)
r8 = Restaurant(30, 2)
r9 = Restaurant(70, 2)
r10 = Restaurant(250, 5)
print()
print("***************")
print("** Unsorted: **")
print("***************")
print()
restaurants = [r1, r2, r3, r4, r5, r6, r7, r8, r9, r10]
for restaurant in restaurants:
print(restaurant.ratio, restaurant.stars)
print()
print("***************")
print("** Sorted: **")
print("***************")
print()
sorted_restaurants = sorted(restaurants, key = lambda x: x.ratio, reverse = True)
for restaurant in sorted_restaurants:
print(restaurant.ratio, restaurant.stars)
print()
print("*********************")
print("** Begin Rucksack: **")
print("*********************")
print()
max = 5
budget = 100
spent = 0
quantity = 0
rucksack = []
for i in itertools.count():
if len(rucksack) >= max or i == len(sorted_restaurants):
break
sorted_restaurants[i].display()
if sorted_restaurants[i].cost + spent <= budget:
spent = spent + sorted_restaurants[i].cost
rucksack.append(sorted_restaurants[i])
print("Total Cost: $" + str(sum([x.cost for x in rucksack])))
print("Total Stars: " + str(sum([x.stars for x in rucksack])))
print()
print("*****************")
print("** Final List: **")
print("*****************")
print()
for restaurant in rucksack:
restaurant.display()
budget
= maximales Rucksackgewicht in kg, max
= Anzahl der Gegenstände, die der Rucksack aufnehmen kann, stars
= ein gewisser Wert auf dem Gegenstand und cost
= Gegenstandsgewicht in kg
r8
Restaurant 15 $ pro Stern zu , was bedeutet, dass es beim Generieren der Liste zuerst in die Liste aufgenommen wird und mit den verbleibenden 70 $ nur 2 weitere Sterne erhalten kann. Wenn es jedoch klug genug wäre, dies zu überspringen (obwohl es das beste Verhältnis von Dollar zu Stern ist, wäre das r1
Restaurant tatsächlich eine bessere Wahl für das Budget, da es 100 $ kostet und 5 Sterne kostet