특정 예산과 조합에 대한 최대 한도를 고려하여 별 수를 최대화하려고합니다.
질문 예 :
500 유로의 예산으로 최대 허용 레스토랑 이하를 방문하여 식사를하고 가장 많은 별을 모으십시오.
최대 10 개의 최대 식당에 대해 1 백만 개의 식당 인스턴스를 처리 할 수있는 효율적인 알고리즘을 작성하려고합니다.
참고 : 이것은 어제 내가 물었던 질문의 교차 게시물입니다. Java : 필드를 기반으로 큰 객체 목록을 가장 효율적으로 조합하십시오.
아래 솔루션은 별표 당 15 $를 r8
식당에 할당합니다. 즉, 목록을 생성 할 때 목록에 우선 순위를두고 나머지 70 $로만 별 2 개를 더 얻을 수 있습니다. 그러나 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
= = 배낭 최대 무게, kg max
= 배낭이 담을 수있는 품목의 수 , = 품목의 stars
일부 가치 및 cost
kg의 품목 무게
r8
레스토랑에 할당합니다. 즉, 목록을 생성 할 때 목록에 먼저 넣고 나머지 70 $로 별을 2 개 더 얻을 수 있습니다. 그러나, 그것을 건너 뛰기에 충분히 현명하다면 (스타 당 최고의 달러 임에도 불구하고, r1
식당은 실제로 100 $ 비용과 별 5 개이기 때문에 예산에 더 나은 선택이 될 것입니다