Получение правильной комбинации с ограничениями - PullRequest
0 голосов
/ 23 апреля 2020

Предположим, мы можем выбрать элемент (можно повторить) из следующего массива. Здесь я предполагаю, что 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).

Полагаю, это проблема оптимизации.

Кстати, я просто хотел бы знать хороший алгоритм, и любой язык программирования мне подходит.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...