Tôi đang tìm cách tối đa hóa số lượng sao cho một ngân sách nhất định và giới hạn tối đa cho kết hợp.
Câu hỏi ví dụ:
Với ngân sách 500 euro, chỉ ghé thăm các nhà hàng được phép tối đa hoặc ít hơn, dùng bữa và thu thập nhiều ngôi sao nhất có thể.
Tôi đang tìm cách viết một thuật toán hiệu quả, có khả năng xử lý 1 triệu trường hợp Nhà hàng cho tối đa 10 Nhà hàng tối đa.
Lưu ý, đây là một bài đăng chéo từ một câu hỏi tôi đã hỏi ngày hôm qua: Java: Nhận kết hợp hiệu quả nhất của Danh sách đối tượng lớn dựa trên một trường
Giải pháp bên dưới sẽ chỉ định 15 đô la cho mỗi sao cho r8
Nhà hàng, điều đó có nghĩa là khi tạo danh sách, nó sẽ đưa danh sách đó vào danh sách trước và với 70 đô la còn lại, chỉ có thể nhận thêm 2 sao cho tổng cộng 4 sao. Tuy nhiên, nếu đủ thông minh để bỏ qua r8
nhà hàng (mặc dù đó là tỷ lệ đô la trên sao tốt nhất), r1
nhà hàng thực sự sẽ là lựa chọn tốt hơn cho ngân sách, vì chi phí 100 đô la và 5 sao.
Bất cứ ai có thể giúp cố gắng vấn đề và đánh bại các giải pháp hiện tại?
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
= trọng lượng ba lô tối đa tính bằng kg, max
= số lượng vật phẩm mà chiếc ba lô có thể giữ, stars
= một số giá trị trên vật phẩm và cost
= trọng lượng vật phẩm tính bằng kg
r8
Nhà hàng, điều đó có nghĩa là khi tạo danh sách, nó sẽ đưa danh sách đó vào danh sách trước và với 70 đô la còn lại, chỉ có thể nhận thêm 2 sao. Tuy nhiên, nếu đủ thông minh để bỏ qua điều đó (mặc dù đó là tỷ lệ đô la trên sao tốt nhất, r1
nhà hàng thực sự sẽ là lựa chọn tốt hơn cho ngân sách, vì đó là chi phí 100 đô la và 5 sao