Имя: Пароль:
IT
 
Подбор чисел из списка, которые в сумме дают нужное число
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. для каждого элемента массива подбираю сумму других элементов при этом перебираю только те элементы которые меньше и не больше остатка суммы. по идеи в итоге должен получить все комбинации.