我希望在给定预算和最大限制组合的情况下,最大化星级数量。
请注意,这是我昨天提出的问题的跨贴: Java:根据字段从大型对象列表中获取最有效的组合 下面的解决方案将为“r8”餐厅分配15美元/星,这意味着在生成列表时,它首先放在列表中,且剩余70美元只能再获得2颗星,总共4颗星。但是,如果足够聪明地跳过“r8”餐厅(即使它是最佳的每星美元比率),则“r1”餐厅实际上会是预算的更好选择,因为它的成本为100美元,具有5颗星。
有人能否帮忙尝试解决这个问题,并打败当前的解决方案吗?
我希望编写一个高效算法,可以处理多达1百万个餐厅实例,最多可选择10个餐厅。示例问题:
有500欧元的预算,只访问允许的最大餐厅数量或更少,用餐并收集最多的星级。
请注意,这是我昨天提出的问题的跨贴: Java:根据字段从大型对象列表中获取最有效的组合 下面的解决方案将为“r8”餐厅分配15美元/星,这意味着在生成列表时,它首先放在列表中,且剩余70美元只能再获得2颗星,总共4颗星。但是,如果足够聪明地跳过“r8”餐厅(即使它是最佳的每星美元比率),则“r1”餐厅实际上会是预算的更好选择,因为它的成本为100美元,具有5颗星。
有人能否帮忙尝试解决这个问题,并打败当前的解决方案吗?
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
表示最大背包重量(单位为公斤),max
表示背包能够容纳的物品数量,stars
表示物品的某个值,cost
表示物品的重量(单位为公斤)。 - AK47r8
餐厅分配了每颗星15美元的价格。这意味着在生成列表时,它首先将其放入列表中,并且剩下的70美元只能获得2颗星。然而,如果它足够聪明地跳过它(即使它是最佳的每颗星美元比率),r1
餐厅实际上会是预算更好的选择,因为它的成本是100美元和5颗星。 - AK47