Предположим, мы можем выбрать элемент (можно повторить) из следующего массива. Здесь я предполагаю, что id и цена одинаковы только для простоты и для обозначения, что это разные вещи.
let products = [{
id: 1,
price: 1
}, {
id: 2,
price: 2
}, {
id: 3,
price: 3
}, {
id: 4,
price: 4
}, {
id: 5,
price: 5
}, {
id: 10,
price: 10
}, {
id: 20,
price: 20
}, {
id: 30,
price: 30
}, {
id: 40,
price: 40
}]
Ограничения:
- Мы можем выбрать максимум 5 товаров с другой идентификатор Но мы можем выбрать повторное множество пунктов, чтобы достичь минимальной цены.
- Минимальная цена должна быть, скажем, 40.
- Сумма общей цены должна быть близка к минимальной цене.
Что я делал до сих пор? Сначала я отсортировал данные по следующему коду:
products.sort((a,b)=> (a.price - b.price))
Я получил это:
[
{
"id": 1,
"price": 1
},
{
"id": 2,
"price": 2
},
{
"id": 3,
"price": 3
},
{
"id": 4,
"price": 4
},
{
"id": 5,
"price": 5
},
{
"id": 10,
"price": 10
},
{
"id": 20,
"price": 20
},
{
"id": 30,
"price": 30
},
{
"id": 40,
"price": 40
}
]
Теперь я пытаюсь добавить, пока мы не достигнем минимальной цены.
let minimumPrice = 40
let maxItemToAdd = 5
let priceAdded = 0
let itemsToAdd = [] // This represent how we should add item that helps to achieve goal
let currentIndex = 0;
while(priceAdded<= minimumPrice && itemToAdd <= maxItemToAdd){
// What do do here now.
}
До сих пор я считаю, что это правильное решение может быть 1 + 4 + 5 + 10 + 20 = 40 долларов, и это лучше, чем 2 + 4 + 5 + 10 + 20 = 41 доллар, потому что 40 долларов близки к минимальной цене (40) и есть также максимальный пункт (5). 30 + 10 не является хорошим решением, потому что (имея только 2 предмета) не близко к максимальному предмету (5).
Полагаю, это проблема оптимизации.
Кстати, я просто хотел бы знать хороший алгоритм, и любой язык программирования мне подходит.
Спасибо.