【发布时间】:2020-03-24 10:08:37
【问题描述】:
在给定一定的预算和组合的最大限制的情况下,我希望最大限度地增加星星的数量。
示例问题:
预算为 500 欧元,仅访问最多允许或更少的餐厅,用餐并收集尽可能多的星星。
我正在寻找一种高效的算法,它可能为最多 10 家餐厅处理 100 万个餐厅实例。
注意,这是我昨天问的一个问题的交叉帖子: Java: Get the most efficient combination of a large List of objects based on a field
下面的解决方案将为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= 物品上的一些价值和@ 987654329@ = 商品重量(公斤) -
发布的代码有什么问题?
-
@cricket_007 根据订单,它为
r8餐厅分配每颗星15美元,这意味着在生成列表时,它首先将其放入列表中,剩下的70美元它只能再获得2星。但是,如果它足够聪明,可以跳过它(即使它是每颗星的最佳美元比率,r1餐厅实际上是预算的更好选择,因为它的成本为 100 美元和 5 颗星
标签: python python-3.x combinations knapsack-problem