|
Подбор чисел из списка, которые в сумме дают нужное число | ☑ | ||
---|---|---|---|---|
0
1cnik2
13.07.10
✎
06:25
|
Иногда сталкиваюсь с задачей определить, из каких документов состоит определенная сумма. Задача в том, чтобы из конечного множества чисел выбрать подмножество их, в сумме равное нужному числу. Както давно нашел алгоритм в старой книжечке по программированию, буквально из 15 строчек, но реализация потерялась(
Кто-нибудь делал такое? Поделитесь, если есть.. |
|||
1
skunk
13.07.10
✎
06:31
|
у гугла спросить о задачках о рюкзаке или ранце
|
|||
2
Начинающий Программер
13.07.10
✎
06:48
|
Первое, что тна ум приходит что-то в этом роде: (S - искомая сумма, i - элементы сумм).
Для i=1 по КоличествоЭлементов() Цикл T = i1 + i(следующее); Если S = T Тогда Записываем составные части Т куда-нить в таблицу; КонецЕсли; КонецЦикла; Потом этот же цикл, но начать с i2. |
|||
3
Начинающий Программер
13.07.10
✎
06:48
|
Но наверняка есть что-нибудь поизящнее)
|
|||
4
strange2007
13.07.10
✎
06:50
|
(2) А если надо выкинуть 3 элемент для оптимальности?
|
|||
5
Начинающий Программер
13.07.10
✎
06:53
|
3-й элемент - это какой?
|
|||
6
1cnik2
13.07.10
✎
07:14
|
||||
7
3nt
13.07.10
✎
07:45
|
(6) тока алгоритм
Жадный алгоритм имеет сложность O(n log(n)), и гарантирует нахождение решения, не хуже чем в два раза от оптимального. Алгоритмы динамического программирования для задачи о рюкзаке дают точное решение за время O(nf*) или O(nB). Если величины f* и B не ограничена сверху никаким полиномом (то есть имеются большие коэффициенты), то эти псевдополиномиальные алгоритмы не является полиномиальными И еще тебе потребуются ВСЕ документы то есть с ростом базы это тоже будет не быстро. А после обрезки и вообще невозможно )))) |
|||
8
1cnik2
13.07.10
✎
08:20
|
(6) посмотрел повнимательнее, то что я нашел - не то, что надо.
эти алгоритмы находят приближенное решение, с условием, что сумма весов НЕ БОЛЬШЕ указанного значения. а мне надо алгоритм, который получает все наборы(ну или в крайнем случае первый попавшийся), сумма весов которых РАВНА указанному значению |
|||
9
1cnik2
13.07.10
✎
11:04
|
up..
неужели никто не делал? |
|||
10
Михаил Козлов
13.07.10
✎
13:48
|
(8) Таких может и не быть.
Попробуйте неявную схему перебора, причем имеет смысл начинать с больших сумм. И попробовать сделать отсечение. |
|||
11
Жан Пердежон
13.07.10
✎
16:42
|
(9) проще развернуть по документам, делающим движения...
|
|||
12
Domovoi
13.07.10
✎
16:58
|
(8)Симплекс метод)
|
|||
13
Ёпрст
13.07.10
✎
17:03
|
||||
14
Shurjk
13.07.10
✎
17:08
|
Если бы не нашел готовый алгоритм я бв сделал так:
1 упорядочить массив 2. для каждого элемента массива подбираю сумму других элементов при этом перебираю только те элементы которые меньше и не больше остатка суммы. по идеи в итоге должен получить все комбинации. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |