powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / поиск заданного кол-ва чисел в сумме дающих нужное число
21 сообщений из 21, страница 1 из 1
поиск заданного кол-ва чисел в сумме дающих нужное число
    #34712835
serg_psv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!

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

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

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

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

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

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


ЗЫ. если вы знаете сумму N максимальных и N минимальных челнов, то можете сразу прикинуть, из какой области (после сортировки) значений (в промежутке макс/минимум) вам стоит стартовать для перебора. Это, в отличие от обрезания, не уменьшит количество шагов на переборе, но повысит шансы наткнуться на решение раньше (если вас не интересуют все возможные решения, а только первое (первых несколько))
...
Рейтинг: 0 / 0
поиск заданного кол-ва чисел в сумме дающих нужное число
    #34713203
Alex_soldier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А это, случаем, не задача о Рюкзаке?
...
Рейтинг: 0 / 0
поиск заданного кол-ва чисел в сумме дающих нужное число
    #34713348
Да, это она и есть. Примените локальный поиск.
...
Рейтинг: 0 / 0
поиск заданного кол-ва чисел в сумме дающих нужное число
    #34714009
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
поиск заданного кол-ва чисел в сумме дающих нужное число
    #34714028
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV wrote:

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

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


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

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

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

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

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

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

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

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

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


Рандомный поиск может пойти при нормальном распределении выборки. А тут я уверен в этом, что это не так на 99%. Хотя надо пойти проверить ....
...
Рейтинг: 0 / 0
поиск заданного кол-ва чисел в сумме дающих нужное число
    #34721223
zloy den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То что описывал Lelikk , это случайно не алгоритм поиска с возвратом? Тогда это аналог задачи о расстановке ферзей(и множества других)
...
Рейтинг: 0 / 0
поиск заданного кол-ва чисел в сумме дающих нужное число
    #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]