Saya mencari untuk memaksimalkan jumlah bintang yang diberikan anggaran tertentu dan batas maksimum pada kombinasi.
Contoh pertanyaan:
Dengan anggaran 500 euro, hanya mengunjungi restoran maksimum yang diizinkan atau kurang, makan dan mengumpulkan bintang sebanyak mungkin.
Saya ingin menulis algoritma yang efisien, yang berpotensi memproses 1 juta contoh restoran hingga 10 restoran maks.
Catatan, ini adalah pos silang dari pertanyaan yang saya ajukan kemarin: Java: Dapatkan kombinasi paling efisien dari daftar besar objek berdasarkan bidang
Solusi di bawah ini akan menetapkan $ 15 per bintang ke r8
Restoran, yang berarti bahwa ketika membuat daftar, itu menempatkan itu ke dalam daftar pertama, dan dengan $ 70 yang tersisa itu hanya bisa mendapatkan 2 bintang lagi memberikan total 4 bintang. Namun, jika itu cukup pintar untuk melewati r8
restoran (meskipun itu adalah rasio dolar per bintang terbaik) r1
restoran sebenarnya akan menjadi pilihan yang lebih baik untuk anggaran, karena biaya $ 100 dan 5 bintang.
Adakah yang bisa membantu mencoba masalah dan mengalahkan solusi saat ini?
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
= berat ransel maksimal dalam kg, max
= jumlah barang yang dapat disimpan ransel, stars
= beberapa nilai pada barang tersebut dan cost
= berat barang dalam kg
r8
Restoran, yang berarti bahwa ketika membuat daftar, ia menempatkan itu ke dalam daftar pertama, dan dengan sisa $ 70 itu hanya bisa mendapatkan 2 bintang lagi. Namun, jika itu cukup pintar untuk melompati itu (meskipun itu adalah rasio dolar per bintang terbaik, r1
restoran sebenarnya akan menjadi pilihan yang lebih baik untuk anggaran, karena itu adalah $ 100 biaya dan 5 bintang