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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2008, 19:31   #1
RIP VIP
 
Аватар для RIP VIP
 
Регистрация: 01.05.2008
Сообщений: 4
Вопрос Сумма

Дан массив N натуральных чисел. Требуется найти все возможные суммы элементов массива, причем в сумму не может входить элемент массива с одним и тем же значением более одного раза. Сумму из одного слагаемого не учитывать.

Пример: 2, 2, 4, 1, 1, 1
Ответ: 3, 5, 6, 7

Помогите, пожалуйста... До чего додумался пока что, это все возможные суммы двух любых элементов(((

Последний раз редактировалось RIP VIP; 02.05.2008 в 09:47.
RIP VIP вне форума Ответить с цитированием
Старый 01.05.2008, 22:32   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Пример: 2, 2, 4, 1, 1, 1
Ответ: 3, 5, 6, 7

Помогите, пожалуйста... До чего додумался пока что, это все возможные суммы двух любых элементов(((
Гм... сумма любых двух элементов... а как 7 получилось... из двух то элементов
Код:
Const
  Mas: Array[1..6] of Integer = (2, 2, 4, 1, 1, 1);
Var 
  NewMas: Array[1..6] of Integer;
  Count: Integer;
...
Begin
  //Сначала уберём все повторяющиеся числа
  For I := 1 to 6 do begin
    b := true;
    For J := 1 to 6 do
    If (Mas[I] = Mas [J]) and (I<>J) then b := false;
    If b then Inc(Count);
    NewMas[Count] := Mas[I]
  end;
  ...
  //А затем циклом все суммы перебираем и сортируем в новый массив SumMass например
  //и если в сортированнои массиве SumMas[I] <> SumMas[I+1] тогда выписываем его значение
  //По-моему это оптимальный способ
End.

Последний раз редактировалось eoln; 01.05.2008 в 22:35.
eoln вне форума Ответить с цитированием
Старый 01.05.2008, 23:19   #3
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
Вопрос Что-то здесь не так

Значений в наличии - три: 1, 2, 4.
Сочетаний из трёх - семь: 1, 2, 4, 1+2=3, 1+4=5, 2+4=6, 1+2+4=7
В ответе - четыре последних варианта.

Что, сумма из одного слагаемого - не сумма? Ну, это где угодно, только не в программировании Однако - плетью обуха...

Массив значений, пожалуй, я бы заполнял так:
Код:
count:=0
for i:=1 to 6 begin
	b:=true;
	for j:=1 to count
		if Mas[i]=NewMas[j] then b:=false;
	if b then begin
		count:=count+1;
		NewMas[count]:=Mas[i]
	end
end;
(Sorry, Паскаля у меня нет, и не писал я на нём лет... Лучше не вспоминать, сколько. Что-нибудь вроде Exit For в нём есть?)

Осталось соорудить сочетания из count по "от двух до count", без перестановок, и просуммировать (скорее всего, попутно).

Рекурсии разрешены?

P.S. Сортировать NewMas, конечно, незачем.

Последний раз редактировалось дмидми; 01.05.2008 в 23:24.
дмидми вне форума Ответить с цитированием
Старый 02.05.2008, 09:46   #4
RIP VIP
 
Аватар для RIP VIP
 
Регистрация: 01.05.2008
Сообщений: 4
Вопрос Ну явно что-то не так

Цитата:
Сообщение от eoln
Гм... сумма любых двух элементов... а как 7 получилось... из двух то элементов
У меня-то как раз и не получилось =) Там ведь пример написан

Цитата:
Что, сумма из одного слагаемого - не сумма?
В рамках данной задачи нет.

Цитата:
Массив значений, пожалуй, я бы заполнял так...
Спасибо, конечно, но с заполнением массива значений у меня проблем не возникло.

Цитата:
Сообщение от eoln
А затем циклом все суммы перебираем
А вот с перебором всех сумм как раз проблемы... Можно поподробней?
Цитата:
Sorry, Паскаля у меня нет
Можно и на си...

Цитата:
Рекурсии разрешены?
Да

Цитата:
Осталось соорудить сочетания из count по "от двух до count", без перестановок, и просуммировать (скорее всего, попутно)
Не совсем понял((

Последний раз редактировалось RIP VIP; 02.05.2008 в 10:00.
RIP VIP вне форума Ответить с цитированием
Старый 02.05.2008, 10:59   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,528
По умолчанию

рекурсия ( текущая сумма, индекс последнего использованного)

для каждого индекса из оставшихся

добавить индекс к текущей сумме и внести в список

рекурсия ( сумма, индекс)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 02.05.2008, 11:18   #6
RIP VIP
 
Аватар для RIP VIP
 
Регистрация: 01.05.2008
Сообщений: 4
По умолчанию

Что-то в этом есть... сейчас буду пробовать...
RIP VIP вне форума Ответить с цитированием
Старый 02.05.2008, 11:20   #7
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
Лампочка Можно и без рекурсий

Пример самого тупого перебора с жёстким ограничением по числу элементов исходного множества.

Си под рукой тоже нет %)
Слепил на VBA. Можно создать новую книгу Excel, добавить в нее модуль и вставить в него
Код:
Option Explicit
Option Base 1

Sub RIP_VIP()
    Const P As Long = 2
    Dim i As Long, j As Long, Cnt As Long
    Dim msk As Long, c As Long, nm, s
    
    nm = Array(1, 2, 4) '1 to Cnt
    Cnt = UBound(nm)
    
    'Выбираем все непустые подмножества множества nm
    For msk = 1 To 2 ^ Cnt - 1
        s = 0: c = 0
        For i = 1 To Cnt
            If 2 ^ (i - 1) And msk Then s = s + nm(i): c = c + 1
        Next
        'Учитываем только подмножества,
        'состоящие не менее чем из P элементов
        If c >= P Then WriteOut (s)
    Next
End Sub

Private Sub WriteOut(s)
    ActiveCell = s
    ActiveCell.Offset(1).Select
End Sub
дмидми вне форума Ответить с цитированием
Старый 02.05.2008, 12:17   #8
RIP VIP
 
Аватар для RIP VIP
 
Регистрация: 01.05.2008
Сообщений: 4
По умолчанию

Что-то показывает похожее на ответ...

Последний раз редактировалось RIP VIP; 02.05.2008 в 12:30.
RIP VIP вне форума Ответить с цитированием
Старый 02.05.2008, 14:33   #9
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
Смех Да ну?!

Ай-яй-яй... Это я что-то упустил Пр-роклятый склероз...
Почти офтоп: а пустое множество у вас, поди, и вовсе за множество не держат?
дмидми вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сумма ряда Sova123456 Помощь студентам 8 11.06.2010 17:10
Сумма Label-ов artemavd Общие вопросы Delphi 7 14.07.2008 18:37
Сумма прописью LX Da Mad Microsoft Office Excel 5 27.06.2008 01:54
Сумма чисел gamer123 Помощь студентам 2 19.01.2008 20:42
сумма столбца zetrix БД в Delphi 1 01.11.2006 15:42