Другие языки программирования и технологии

Нужна помощь с алгоритмом. Возможно, проще будет математикам :)

Мне нужно придумать алгоритм перебора массива со случайными числами.
Заданные параметры: количество чисел и сумма.
Суть в том, чтобы найти числа, сумма которых будет максимально приближена к заданной сумме, количество которых будет максимально приближено к заданному количеству, а разница между числами будет минимальна.

Очень не четкое условие, но, по крайней мере можно задать приоритеты: сумма > разница > количество. Сумма может быть выше или ниже заданной, здесь тоже можно задать приоритет: сумма ниже > сумма выше. То-есть, если сумма получилась ниже, стоит сделать ее выше.

К примеру:
массив [ 2, 3, 7, 4, 6, 4, 8], количество 3, а сумма 12. Лучшим вариантом будет [ 3, 4, 4]
массив [ 2, 3, 7, 4, 6, 9, 8], количество 3, а сумма 12. Лучшим вариантом будет [ 4, 6, 2]
массив [ 1, 7, 11, 6, 10], количество 3, а сумма 12. Лучшим вариантом будет [ 7, 6]
массив [ 24, 32, 75, 12, 5, 23, 15, 42, 9, 54] количество 5, а сумма 200. Лучшим вариантом будет [ 42, 32, 54, 24, 23, 75]
СА
Сабат А.
13 644
нужно запилить паттерн итератор потом использовать sql запрос
на каком языке пишешь?
Александр Шлепков
Александр Шлепков
17 648
Лучший ответ
Хе, шизофреник алъэбло и тут посрал, так ничего и не поняв!

А в общем, если есть массив А размерности r и сумма n чисел из массива, равная s, то надо просто сконструировать функцию принадлежности кортеж-подмножества массива А. Всего таких кортежей без пустого подмножества будет 2ⁿ-1. У каждого будет его длина (не количество его элементов, а длина как минимум модуля разности входящих в него элементов!) и функция принадлежности - это классическое нечёткое множество, составленное из всех непустых подмножеств массива А. Теперь можно ставить оптимизационную задачу: найти нечёткий минимум, то ешь нечёткое множество, содержащее все возможные длины, причём для каждой возможной длины существует набор кортеж-подмножеств, для которых функция принадлежности максимальна - этот максимум и будет новой функцией принадлежности для нечёткого множества всех длин!

Вся трудность здесь в порождении подмножеств заданного массива, в задании функции принадлежности и в возможной неединственности окончательного решения.
Namiq Qoyceyev
Namiq Qoyceyev
28 648
Сабат А. Я не знаю, кто такой шизофреник алъэбло :)
>> массив [ 2, 3, 7, 4, 6, 4, 8], количество 3, а сумма 12. Лучшим вариантом будет [ 3, 4, 4]
Вообще-то : 2, 3, 7

Ф ( массив ; сколько надо ; что выбрано ) , первый вызов - от всего массива с требуемым результатом
цикл по массиву, берем a[i]
{
осталось = сколько надо - a[i] ;
в функцию оценки передаем, что имеем - принимаем решение - надо ли брать еще: если перебор, то уже нет; если недобор - может быть ; есть совпало - то замечательно ; если долго думаем - пора прерваться
рекурсия: Ф ( [ массив, но уже без a[i] ] ; осталось ; [что набрали] )
}