Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / поиск заданного кол-ва чисел в сумме дающих нужное число / 21 сообщений из 21, страница 1 из 1
08.08.2007, 10:01
    #34712835
serg_psv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
Привет всем!

подскажите с идеей. Есть набор цифр с большим разбросом значений (от 0.01 до 9999.99)
все цифры положительные. Абсолютно точно известно, что десять цифр из них дают в сумме Х.
необходимо найти эти десять цифр.

Например:
есть ряд : 1 2 3 3 4 9 9 1 8
знаем что сумма 4х цифр дает 12. необходимо найти из каких именно цифр это складывается.
в моем примере это 2,3,3,4.

есть идеи?
...
Рейтинг: 0 / 0
08.08.2007, 10:15
    #34712892
Alex_soldier
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
Четыре вложенных цикла,
перебор всех вариантов с проверкой на равенство суммы,
вывод всех подходящих.

---
Идеи движут Мир!
...
Рейтинг: 0 / 0
08.08.2007, 10:21
    #34712925
serg_psv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
прямой перебор не подходит.
ряд цифр в реальности состоит из 500-1500 цифр.
прямой перебор это факториал числа. А факториал 1500 - это ОЧЕНЬ!!! много.
кроме того, ищутся не 4 цифры в нем а 100-200 цифр.
...
Рейтинг: 0 / 0
08.08.2007, 10:28
    #34712948
belugin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
serg_psvпрямой перебор не подходит.

Можно прекращать перебор когда точно знаем что результат будет не подходящим, например, когда сумма оставшихся цифр меньше чем оставшаяся сумма или наоборот, самое маленькое число больше чем оставшаяся сумма
...
Рейтинг: 0 / 0
08.08.2007, 10:54
    #34713074
serg_psv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
тоже не подходит, поскольку точно известно, что есть набор цифр подходящий под условие. Можно сказать - что его формируют /загадывают/ заранее.
...
Рейтинг: 0 / 0
08.08.2007, 11:01
    #34713102
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
serg_psvпрямой перебор не подходит.
ряд цифр в реальности состоит из 500-1500 цифр.
прямой перебор это факториал числа. А факториал 1500 - это ОЧЕНЬ!!! много.
кроме того, ищутся не 4 цифры в нем а 100-200 цифр.начните с сортировки. После этого сумеете обрезать* все циклы сверху/снизу (по разнице промеж числом и суммой уже взятых первых членов (т.е. чисел из наружних циклов)). никакого факториала уже не будет. (кстати и для тупого перебора факториал - оценка слишком сверху, будет не фак, а "С из 1500 по 100-200". это уже "несколько меньше").

зы *дополнительно обрезать оценку в промежутошном цыкле можно заранее вычислив наименьшие суммы 1-го, 2-х и 3-х и т.д. (наименьших) членов.
...
Рейтинг: 0 / 0
08.08.2007, 11:08
    #34713121
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
serg_psvтоже не подходит, поскольку точно известно, что есть набор цифр подходящий под условие. Можно сказать - что его формируют /загадывают/ заранее.?млин, что ж вы так спешите?
вам предложили, если я правильно понял, обрезать внутренний цыкл, "как только..." , это не мешает вам войти во внешнем на новом уровне - и ищите себе "заведомо подходящее решение".


ЗЫ. если вы знаете сумму N максимальных и N минимальных челнов, то можете сразу прикинуть, из какой области (после сортировки) значений (в промежутке макс/минимум) вам стоит стартовать для перебора. Это, в отличие от обрезания, не уменьшит количество шагов на переборе, но повысит шансы наткнуться на решение раньше (если вас не интересуют все возможные решения, а только первое (первых несколько))
...
Рейтинг: 0 / 0
08.08.2007, 11:31
    #34713203
Alex_soldier
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
А это, случаем, не задача о Рюкзаке?
...
Рейтинг: 0 / 0
08.08.2007, 12:05
    #34713348
поиск заданного кол-ва чисел в сумме дающих нужное число
Да, это она и есть. Примените локальный поиск.
...
Рейтинг: 0 / 0
08.08.2007, 14:26
    #34714009
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
serg_psv wrote:

> Привет всем!
>
> подскажите с идеей. Есть набор цифр с большим разбросом значений (от 0.01
> до 9999.99) все цифры положительные. Абсолютно точно известно, что десять
> цифр из них дают в сумме Х. необходимо найти эти десять цифр.
>
> Например:
> есть ряд : 1 2 3 3 4 9 9 1 8
> знаем что сумма 4х цифр дает 12. необходимо найти из каких именно цифр это
> складывается. в моем примере это 2,3,3,4.
>
> есть идеи?
Первое, что пришло в голову:
1) Сортируем массив цифр по возрастающей.
2) находим (двигаясь от конца к началу первое значение меньшее или равное
искомой сумме.
3) Далее, постепенно (i--) двигаясь к началу массива, для каждого такого
найденного значения:
3.1) сохраняем сумму.
3.2) ищем двоичным поиском первое в диапазоне от начала массива
до "родительского" числа (не включая его) число меньшее или равное этой
сумме.
3.3) Если такое число не найдено, значит, комбинаций не существует, выходим.
3.4) сохраняем его в стек/динамический массив значений значений.
3.4) вычитаем найденное число из суммы.
3.5) если результат равен 0, выходим, попутно печатая все содержимое стека,
иначе переходим к пункту 3.1.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
08.08.2007, 14:30
    #34714028
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
ErV wrote:

> Первое, что пришло в голову:
в алгоритме небольшой глюк (нужен i-- при рекурсивном поиске значений, иначе
не будут выведены ВСЕ варианты) но идея должна быть понятна.

Для оптимизации можно добавить параллельный массив, где будет храниться
сумма всех предыдущих элементов - чтобы определить, когда дальше искать
элементы суммы нет смысла.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
08.08.2007, 17:39
    #34714836
serg_psv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
ErV
ErV wrote:
> Первое, что пришло в голову:
..идея должна быть понятна.


ErV - спасибо. Такая идея тоже приходила мне в голову. Искать для одного из слагаемых свою, меньшую) комбинацию слагаемых.
нашел похожую тему http://]/topic/56272

Сейчас изучаю метод ветвей и границ - мне кажется он то что надо для меня.
поскольку придется анализировать 22638 чисел, ищя в ней 1063 числа в сумее дающих нужное мне {

Кстати, в универе изучали задачу о рюкзаке. все забыл :(
кто-нить может поделиться ссылками на классическое математическое решение этой задачи?
...
Рейтинг: 0 / 0
09.08.2007, 05:37
    #34715549
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
serg_psv wrote:

> кто-нить может поделиться ссылками на классическое математическое решение
> этой задачи?
Если классическая, то найдется поиском.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
09.08.2007, 10:36
    #34715995
optimizer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
динамическое программирование
...
Рейтинг: 0 / 0
09.08.2007, 14:21
    #34717124
Lelikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
задача рекурсивна - то есть в отсортированном массиве начинаем с больших чисел и последовательно откусывая сводим задачу от n, к задаче от n-1.
Глубина рекурсии не превысит 10 -для десяти чисел в сумме, чтобы не терять произовдительности вместо явной рекурсии берем ручной стек и цикл.
________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
09.08.2007, 22:39
    #34718502
Valer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
это классическая задача о рюкзаке
если чисел не много, то подойдет перебор
если чисел много никакая рекурсия и перебор не поможет (времени не хватит)

существует быстрый "жадный" алгоритм
есть число R
из списка заданных чисел ищем наибольшее <= R
определяем остаток и снова ищем
т.е. всегда пытаемся засунуть в рюкзак н.б. из имеющихся предметов
результат гарантируется не всегда , зато быстро
...
Рейтинг: 0 / 0
09.08.2007, 22:52
    #34718519
Lelikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
Valerэто классическая задача о рюкзаке
если чисел не много, то подойдет перебор
если чисел много никакая рекурсия и перебор не поможет (времени не хватит)

существует быстрый "жадный" алгоритм
есть число R
из списка заданных чисел ищем наибольшее <= R
определяем остаток и снова ищем
т.е. всегда пытаемся засунуть в рюкзак н.б. из имеющихся предметов
результат гарантируется не всегда , зато быстро

Собственно я предлагаю тоже самое, но с тем существенным отличием, что если мы не попадаем в цель на 10-ом числе, то откатываемся на 9-ое и пробуем следующее (поменьше). Работает на отсортированном массиве естественно. Если число существует, то результат найдется быстро достаточно.
Ваш же алгоритм имеет очень большую вероятность промахнуться, так как берет только один первый вариант.
...
Рейтинг: 0 / 0
10.08.2007, 10:21
    #34719010
Alex_soldier
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
В больших задачах люблю запускать рандомный поиск.
Правда обычно я оцениваю МИН и МАХ, а тут нужно точное соответствие.

Можно попробовать так:
1) Выбирать случайные числа, пока не будет перебора
2) Поочередно перебрать каждый элемент, подставляя на его место каждый оставшийся
3) Выполнить генерацию снова

Есть шанс, что за некоторое время работы будет получено искомое решение.
Но тут никаких гарантий нет!
---
Идеи движут Мир!
...
Рейтинг: 0 / 0
10.08.2007, 12:23
    #34719482
serg_psv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
Alex_soldierВ больших задачах люблю запускать рандомный поиск.
Правда обычно я оцениваю МИН и МАХ, а тут нужно точное соответствие.


Рандомный поиск может пойти при нормальном распределении выборки. А тут я уверен в этом, что это не так на 99%. Хотя надо пойти проверить ....
...
Рейтинг: 0 / 0
10.08.2007, 21:55
    #34721223
zloy den
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
То что описывал Lelikk , это случайно не алгоритм поиска с возвратом? Тогда это аналог задачи о расстановке ферзей(и множества других)
...
Рейтинг: 0 / 0
10.08.2007, 22:50
    #34721282
Lelikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поиск заданного кол-ва чисел в сумме дающих нужное число
Вот, размещу скромную реализацию того что имел ввиду :)
Вроде бы работает стабильно.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
#include "stdafx.h"

#include <fstream>
#include <algorithm>
#include <functional>
#include <vector>
#include <stack>

using namespace std;

typedef vector<int> v_int;
typedef stack<int> s_int;

void load_data(v_int &buffer, int &magic, int &level);
void out_result(s_int &pos, v_int &numbers);

int _tmain(int /*argc*/, _TCHAR* /*argv*/[])
{
	int size, magic, max_level;
	v_int numbers, sums;

	load_data(numbers, magic, max_level);
	size = (int)numbers.size();
	max_level--;

	int sum =  0 ;
	// массив отсортирован по возрастанию
	sort(numbers.begin(), numbers.end(), less<int>());
	// нижние границы отсечения
	for(v_int::iterator iter = numbers.begin(); iter != numbers.end(); iter++)
	{
		sum += *iter;
		sums.push_back(sum);
	}

	// явный стек
	s_int rstack;	
	// номер цифры и текущая искомая сумма
	int level =  0 , level_magic = magic;
	// текущее число
	int pos = size -  1 ;
	// прямой или обратный ход рекурсии
	bool mode = true;
	while(true)
	{
		if (mode)
		{
			// переход через верхнюю границу отсечения
			for(;((pos != - 1 ) && (numbers[pos] > level_magic)); pos--);
			if(pos == - 1 )
			{
				level--;
				mode = false;
				continue;
			}

			// проверка завершения
			if (level == max_level)
			{
				if(level_magic == numbers[pos])
				{			
					rstack.push(pos);
					break;
				}
				
				level--;
				mode = false;
				continue;
			}
			else
			{
				if(level_magic == numbers[pos])
				{
					level--;
					mode = false;
				}
				else
				{
					// новый поиск
					level_magic -= numbers[pos];
					level++;
					rstack.push(pos--);
				}
				continue;
			}
		}
		else
		{
			if(level != - 1 )
			{
				// извлечение из стека
				pos = rstack.top();
				rstack.pop();
				level_magic += numbers[pos--];

				if(pos != - 1 )
					if(sums[pos] >= level_magic)
					{
						level_magic -= numbers[pos];
						level++;

						rstack.push(pos--);
						mode = true;
						continue;
					}
			
				level--;
				mode = false;
				continue;
			}
			else
				break;
		}
	}

	out_result(rstack, numbers);

	return  0 ;
}

void load_data(v_int &buffer, int &magic, int &level)
{
	int size;
	ifstream in_file("C:\\numbers.dat");

	if(in_file.is_open())
	{
		in_file >> magic;
		in_file >> level;
		in_file >> size;

		for(int i =  0 ; i < size; i++)
		{
			int elem;
			in_file >> elem;
			buffer.push_back(elem);
		}
	}
}

void out_result(s_int &pos, v_int &numbers)
{
	ofstream out_file("C:\\result.dat");
	while(!pos.empty())
	{
		out_file << numbers[pos.top()] << endl;
		pos.pop();
	}
	out_file.close();
}

________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / поиск заданного кол-ва чисел в сумме дающих нужное число / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]