Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2014, 00:08   #1
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию Подбор чисел,чтобы вышла определенная сумма в Си

Есть массив из 8 чисел
int rest[12]={20,10,10,5,3,2,1,1};
нужно сделать новый массив из 6 элементов с помощью перестановок так,чтобы получилось число 71
Я не знаю,как такое сделать((((((
Вероника99 вне форума Ответить с цитированием
Старый 23.01.2014, 06:24   #2
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

В чем суть перестановок?
Потому что перестановки не предполагают объединения/замены элементов.
Как вычисляется 71? Сумма элементов?
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 23.01.2014, 07:28   #3
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,680
По умолчанию

Я честно говоря тоже ничего не понял.... Опишите задание по подробнее..
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 23.01.2014, 08:32   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

включаю телепатор...

в связи с тем, что сумма ВСЕХ элементов заданного набора составляет 52,
то:
либо насчёт 71 автор топика ошиблась,
либо речь идёт о банальном разбиении денежной суммы на представленные номиналы купюр (причём, нужно получить ВСЕ возможные варианты представления суммы.
ну, например, для суммы = 4
это варианты:
1+1+1+1
2+1+1
2+2

И, предполагаю, что в таком случае порядок не важен (ну 2+1+1 то же самое, что 1+2+1 )


p.s. резонно возразить, что если в наборе представлены НОМИНАЛЫ, каждый из которых может быть использован не ограниченное число раз, то зачем в наборе по ДВАЖДЫ представлены номиналы 10 и 1. Ну это может быть банальной ошибкой. А может быть, там задумано, чтобы усложнить задачу...

p.p.s. на истину не претендую, просто предположение сделал
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.01.2014, 08:52   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Вероника99 Посмотреть сообщение
Есть массив из 8 чисел
int rest[12]={20,10,10,5,3,2,1,1};
нужно сделать новый массив из 6 элементов с помощью перестановок так,чтобы получилось число 71
Я не знаю,как такое сделать((((((
1. Сумма всех чисел последовательности из 8-и элементов, даёт число = 52-м. Явно, что последовательность из 6-и цифр, даст меньшее число. В данном случае, задача решения не имеет.
2. Для чего, для последовательности состоящей из 8-ми чисел, зарезервирован массив из 12-и элементов?
3. В условии не указано, можно ли использовать одно и то-же число шесть раз подряд, или можно использовать только имеющуюся последовательность?
Ответьте на эти вопросы, и мы постараемся Вам помочь.
Ну и по теме. Если в условии выполняется пункт 3. Формула для расчёта такая:
!6 * !8 = 29030400 комбинаций перестановок.
Для полного перебора, необходимо 14-ть вложенных циклов. Учитывая, что один цикл выполняется 1 мсек (0,001с) = 29030 с или 484 минуты или 8 часов непрерывного счёта.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 23.01.2014 в 09:09.
Smitt&Wesson вне форума Ответить с цитированием
Старый 23.01.2014, 15:47   #6
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

А да сорри, я забыла написать что изначально в новом массиве, в который будут заносится подходящте числа уже есть 50
Вероника99 вне форума Ответить с цитированием
Старый 23.01.2014, 15:51   #7
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
2. Для чего, для последовательности состоящей из 8-ми чисел, зарезервирован массив из 12-и элементов?
Там походу программы в этом массив надо будет заносить еще числа, это все качается той задачи с мишенями,которую я в другой теме скидывала
Вероника99 вне форума Ответить с цитированием
Старый 23.01.2014, 23:44   #8
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Вот что получилось,бредятина, не знаю,что делать
Код:
int CreateArray1(int *r)
{
	int i=0,j,k,j2,j3,j4,j5,sum=50;
	for(i=0;i<9;i++) //25
	{
	for(j=8;j>=(i+5);j--) 
		for(j2=7;j2>=(i+5);j2--)
			for(j3=6;j3>=(i+5);j3--)
				for(j4=5;j4>(i+5);j4--)
				
		{	

			sum+=r[i]+r[j]+r[j2]+r[j3]+r[j4];
			if(sum==71)
			{
				for(k=1;k<=6;)	
				{	
					k++;
					first[k]=r[j++];
	 			}
	    	
			}	
				
		}
	printf("%i\n",sum);
		sum=0;//чтобы не прибавлялось к предыдущей сумме
	}

	return 0;
}
Вероника99 вне форума Ответить с цитированием
Старый 24.01.2014, 01:49   #9
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

ТС нужно выбрать из 8 элементов пять, чтобы при сложении с числом 50 получить в итоге 71. Если брать приведенный ею выше массив {20,10,10,5,3,2,1,1}, то нам понадобится 10+5+3+2+1 +50 =71. В общем получится 4 ответа(т.к. у нас две "10" и две "1"), которые по этому требованию подходят.

Здесь не перестановки нужны, а сочетания. Получается С из 8 по 5 = 56 сочетаний, так что никаких 8 часов на раздумья компа не нужно. Формула есть в вики, если кто не помнит или не проходил. Вот алгоритм генерации сочетаний, но он на pascal'e. А я уже изрядно измучен, поэтому не смогу сейчас вам чем-то существенным помочь:
Код:
begin
  for i := 1 to k do
    A[i] := i; //Первое подмножество
  p := k;
  while p >= 1 do
  begin
    writeln(A[1],..., A[k]); //вывод очередного сочетания
    if A[k] = n then
      p := p - 1
    else
      p := k;
    if p >= 1 then
      for i := k downto p do
        A[i] := A[p] + i - p + 1;
  end;
end;
Авторство не мое. Код из книги "Липский В. «Комбинаторика для программистов», М., Мир, 1988"
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 24.01.2014 в 01:53.
Rin вне форума Ответить с цитированием
Старый 24.01.2014, 07:52   #10
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Пока так..
Код:
#include <stdio.h>
#define n 5
#define ans 71
#define size 8

int a[size] = {20, 10, 10, 5, 3, 2, 1, 1}, b[size];

void p(int sum, int k, int pos)
{
	int flag;
	if (n == k)	
	{
		if (sum+50 == ans)
		{	printf("50 + ");	
			for (int i = 0; i < n-1; i++)
				printf("%d + ", a[b[i]]);
			printf("%d = %d\n", a[b[n-1]]	, ans);
		}	
		return;
	}
	

	for(int i = pos; i < size; i++)
	{	
		b[k] = i;
		p(sum+a[b[k]], k+1, i+1);
				
	}

}
int main()
{
	p(0, 0, 0);	
	return 0;
}
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на подбор чисел и выведения кол-ва вариантов hruma Помощь студентам 5 29.11.2013 15:13
Сумма с несколькими критериями, подсчёт/сумма нечётных чисел XPsihopaTX Microsoft Office Excel 3 11.10.2012 15:00
Сумма чисел Dima-War Общие вопросы C/C++ 9 20.03.2012 23:14
Как в Excel'е организовать пересчёт значений в ячейках так чтобы их сумма оставалась постоянной? Sideshow Microsoft Office Excel 16 18.10.2011 06:44
Сумма чисел gamer123 Помощь студентам 2 19.01.2008 20:42