powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
36 сообщений из 36, показаны все 2 страниц
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733320
kefirko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть исходный (первый) массив:
(52, 41, 1, 75, 12)
Нужно получить новый (второй) массив, состоящий из всех возможных сумм элементов исходного массива:
(52, 41, 1, 75, 12, 93, 53, 127, 64, 42, 116, 53, 76, 13, 87, 94, 168, 105, 128, 65, 139, 117, 54, 128, 88, 169, 106, 180, 140, 129, 181)

Для большего понимания вопроса см. прикрепленный документ. На первом листе в качестве примера все возможные комбинации для массивов длинной от 1 до 5 элементов, а на втором исходные данные и что должно получиться.

Как должен выглядеть алгоритм для получения второго массива? Ну или хотябы подскажите где копать. Есть предположение что это что-то из теории вероятности, но дальше этого предположения ничего не заходит.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733361
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача с полпинка решается вложенными циклами в количестве равном размеру массива. Если он неизвестен на этапе кодирования, то рекурсией с одним циклом внутри и одним - снаружи.

Другой вопрос - надо ли отсекать повторения сумм...
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733378
kefirko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, нет не надо.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733379
kefirko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovЗадача с полпинка решается вложенными циклами в количестве равном размеру массива. Если он неизвестен на этапе кодирования, то рекурсией с одним циклом внутри и одним - снаружи.
Размер массива неизвестен.
А можно пример?

Dimitry SibiryakovДругой вопрос - надо ли отсекать повторения сумм...
Нет, не надо.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733401
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5 элементов, каждый элемент либо включен в сумму, либо нет, т.е. имеем двоичное число из 5 разрядов, где каждый разряд означает включать соответствующий ему элемент массива в сумму или нет.

Дальше перебор чисел от 1 до 2^5 и проверка: 0й бит =1 - плюсуем 0й элемент массива, 1й бит =1 - плюсуем 1й элемент массива и т.д. Понял как решать?
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733404
kefirko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T5 элементов, каждый элемент либо включен в сумму, либо нет, т.е. имеем двоичное число из 5 разрядов, где каждый разряд означает включать соответствующий ему элемент массива в сумму или нет.

Дальше перебор чисел от 1 до 2^5 и проверка: 0й бит =1 - плюсуем 0й элемент массива, 1й бит =1 - плюсуем 1й элемент массива и т.д. Понял как решать?
Вы мне льстите :)
Я не настолько углублен в тему программирования к сожалению. Попроще есть решение?
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733408
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefirkoПопроще есть решение?
Есть. Форум работа. За умеренную денежку порешают твою задачу.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733412
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefirko, в четвертой строке твоего поста ты каким-то чудом написал все сочетания из 5.

Как ты это сделал? Наверное ты знаешь алгоритм.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733417
kefirko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonkefirko, в четвертой строке твоего поста ты каким-то чудом написал все сочетания из 5.
Как ты это сделал? Наверное ты знаешь алгоритм.
Сарказм збс.
В прикрепленном файлике все есть. Написано вручную. Сначала на листочке, потом, для того чтобы было проще понять суть моего вопроса, набросал табличку. Ведь, чем лучше изложен вопрос, тем больше вероятности получить ответ.
Вручную то я и без алгоритма все варианты переберу, а вот каким должен быть код, для меня загадка.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733418
kefirko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сижу вот теперь читаю про рекурсию.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733422
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefirkoСижу вот теперь читаю про рекурсию.
Время теряешь. Я тебе самый простой алгоритм написал. Проще некуда, кода строк 10-15, но никто тебе тут их не напишет. Тут помогают решить а не решают.
Читай про работу с двоичными числами и битовые операции.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733424
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так в Excel будет выглядеть, вроде верно.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733425
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я добрый, вот тебе еще подсказка
Десятичное (счетчик) 4й бит 3 бит 2й 1й 0й Сумма1 0 0 0 0 1 522 0 0 0 1 0 413 0 0 0 1 1 52 + 414 0 0 1 0 0 1
и т.д.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733426
kefirko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VSVLAD, у меня неизвестное кол-во элементов в массиве. Может быть 2, может быть 100. Но за направление спасибо, будем изучать.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733427
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADПримерно так в Excel будет выглядеть, вроде верно.
В правильном направлении копаешь
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733428
kefirko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, спасибо, будем копать.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733433
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefirkoможет быть 100.
С этим сложнее 2^100 примерно 1000000000000000000000000000000 чисел результата. Ограничься 32-мя, тут всего 16 Гб результат займет :)
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733434
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кефирко... Святые угодники....

Вот помедитируй над этим. Хардкорно. Но проясняет первую идейку. Без биткарты.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
{
 for(i=0;i<2;i++){
  for(i1=0;i1<2;i1++){
   for(i2=0;i2<2;i2++){
    for(i3=0;i3<2;i3++){
     for(i4=0;i4<2;i4++){
      printf("%d,",52*i + 41*i1 + 1*i2 + 75*i3 + 12*i4);
     } 
    }
   }
  }
 }
}
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733435
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefirkoЕсть исходный (первый) массив:
(52, 41, 1, 75, 12)
Нужно получить новый (второй) массив, состоящий из всех возможных сумм элементов исходного массива:
(52, 41, 1, 75, 12, 93, 53, 127, 64, 42, 116, 53, 76, 13, 87, 94, 168, 105, 128, 65, 139, 117, 54, 128, 88, 169, 106, 180, 140, 129, 181)

Мля чё тут получать то, рассказываю на пальцах, какие ещё там рекурсии/шмикурсии, мы енто не проходили:
- первые пять сумм это тупо весь исходный массив (так сказать суммы каждого одного исходного элемента)
- следующие 11 (с 93 по 87) енто суммы всех комбинаций по 2 исходные цифири 93 = 52+41.... а 87 = 75+12
- соответственно дальше идут все суммы всех комбинаций по 3 цифири 94 = 52 + 41 + 1...
---------- по 4 .....
- в конце мля сумма одной единственной комбинации из 5 цифирей 181 = 52 + 41 +1 + 75 + 12

С калькулятором не сидел, просто нахрен сразу бросилося в глаза очевидное....
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733437
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВот помедитируй над этим.
ИМХУ. Глупая подсказка. Немасштабируемо. Гибкости нет. Кое-какие языки позволяют сгенерить код и запустить, там это применимо, но далеко не все языки интерпретаторы :)

Ты ему рекурсией универсально напиши. Тогда точно можно будет медитировать
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733438
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боюсь что в рекурсии он уйдет в астрал. Хоть бы так написал.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733440
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonБоюсь что в рекурсии он уйдет в астрал. Хоть бы так написал.
Верно подмечено. По моему про рекурсию надо рассказывать студентам после защиты диплома, и только тем кто сам его писал.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733441
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут еще вопрос какой глубины решения требует препод. Если тема лабы - рекурсии - то да.
Но ключевым заданием в данной задаче будет не генерация сумм что на мой взгляд тривиально
а собственно генератор сочетаний.

Второе если тема лабы - STL - то можно поискать готовые генераторы сочетаний и использовать их.

Третье - если разрешено использовать библиотеки длинной арифметики - то берем любую
по основанию 2 и юзаем.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733442
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmagМля чё тут получать то, рассказываю на пальцах, какие ещё там рекурсии/шмикурсии, мы енто не проходили:
- первые пять сумм это тупо весь исходный массив (так сказать суммы каждого одного исходного элемента)
- следующие 11 (с 93 по 87) енто суммы всех комбинаций по 2 исходные цифири 93 = 52+41.... а 87 = 75+12
- соответственно дальше идут все суммы всех комбинаций по 3 цифири 94 = 52 + 41 + 1...
---------- по 4 .....
- в конце мля сумма одной единственной комбинации из 5 цифирей 181 = 52 + 41 +1 + 75 + 12

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

Алгоритм примерно такой:

1. Записываем в результат сразу весь исходный массив (первая очевидная итерация).
2. Считаем сколько элементов в массиве и вычисляем сколько будет видов переборов комбинаций и делаем перебор,
получая суммы и записывая их в результат (например для этого случая):
- перебор всех по 2 цифры и сумма в результат
- ...................по 3 цифры и ..........................
- ...................по 4 цифры и ..........................
3. Записываем в результат последнюю очевидную сумму всех элементов исходного массива...
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733449
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag,

естественно по пункту 2 переборы будут по:

Если количество элементов N,
то переборы будут от 2-х цифр до N-1 цифр

+ пункт 1 в начале и пунк 3 в конце, нарисуйте блок схему на ватмане,
и отдайте преподу....
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733461
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefirkoу меня неизвестное кол-во элементов в массиве. Может быть 2, может быть 100.

Дополнения:
- Думаю, что уже при 15 - 20 элементах ты можешь не дождаться результата на своем компе... и причин
на это туева хуча....
- реально сделать рабочую программу при известном заранее максимально возможном количестве элементов...
- думаю, что преподу хватит вразумительной блок схемы на ватмане... (мне бы хватило)
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733462
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
var
  Values: array[0..4] of integer= (52, 41, 1, 75, 12);
  Sums: array of integer;

procedure AllSums;
var
  i, j, k: integer;
begin;
  SetLength(Sums, 1 shl Length(Values) - 1);
  k:=0;
  for i:=0 to Length(Values)-1 do begin;
    for j:=0 to k-1 do Sums[j+k]:=Sums[j]+Values[i];
    Sums[k+k]:=Values[i];
    k:=k+k+1;
    end;
  end;
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733470
kefirko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VSVLAD, ваш пример дошел быстрее остальных, спасибо.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733475
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,
for i:=0 to Length(Values)-1 do begin;
for j:=0 to k-1 do Sums[j+k]:=Sums[j]+Values[i];
Sums[k+k]:=Values[i];
k:=k+k+1;
end;
end;

Как то тут маловато всего... а реально проверяли ? просто это не мой язык....


Для примера ТС нужны телодвижения и переборы:
1. Запись всего исходного массива "массив" в результат.
2. перебор всех двух цифр:
For i1 = 1 To 4
For i2 = i1 +1 to 5
' Запись в результат массив(i1) + массив(i2)
next i1
next i2
3. Перебор всех Трех цифр:
For i1 = 1 To 3
For i2 = i1 +1 to 4
For i3 = i2 +1 to 5
' Запись в результат массив(i1) + массив(i2) + массив(i3)
next i1
next i2
next i3
4. Перебор всех Четырех цифр:
For i1 = 1 To 2
For i2 = i1 +1 to 3
For i3 = i2 +1 to 4
For i4 = i3 +1 to 5
' Запись в результат массив(i1) + массив(i2) + массив(i3) + массив(i4)
next i1
next i2
next i3
next i4
5. Запись в результат массив(1) + массив(2) + массив(3) + массив(4) + массив(4)
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733536
kefirko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Готово. Посмотреть на реализацию можно тут .
Вот сам код на Javascript'е:
Код: javascript
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.
array1 = [52, 41, 1, 75, 12] //задаем массив любой длины
array2 = [] //результирующий массив, пока пустой

str = ""
for (k=0; k<array1.length; k++) {
  str += array1[k] + ", "
}
str = str.substring(0, str.length-2)
alert("исходный массив: " + str)

//исходя из длины массива, собираем двоичное число из единиц, у которого разрядность = длине массива
//к примеру, если array1.length=4, то bin=1111, если array1.length=6, то bin=111111
bin = ""
for (i=0; i<array1.length; i++) {
	bin += "1"
}
//при переводе двоичного числа в десятеричное, получим кол-во переборов всех возможных сумм элементов из исходного массива array1
dec = parseInt(bin, 2)

alert("кол-во переборов 10^ / 2^ = " + dec + " / " + bin)

//собираем array2
for (i=1; i<=dec; i++) {
  bin = (i).toString(2)
  raz = array1.length - bin.length
  summ = 0
  for (k=raz+1; k<=array1.length; k++) {
    sub = bin.substring(k-raz-1, k-raz)
    summ += array1[k-1] * sub
  }
  array2[array2.length] = summ
}

str = ""
for (k=0; k<array2.length; k++) {
  str += array2[k] + ", "
}
str = str.substring(0, str.length-2)
alert("результат: " + str)



Отдельная благодарность VSVLAD и Dima T.

Кстати задачка была не для препода, а для себя. Пытался разобраться в оптимизации линейного раскроя материалов или по-другому: "как эффективнее распилить палку на заготовки нужной длины". Прог то готовых куча, а вот как они это делают мне как раз и было интересно. Теперь я беру ближайшее снизу из массива к длине палки и получаю оптимальную комбинацию.
Для вышеизложенного примера:
Заготовки должны быть длиной 52, 41, 1, 75, 12мм, а палка к примеру 100мм.
Самым оптимальным укладыванием будет 94мм (ближайшее снизу), т.е. 52+41+1мм.

Всем спасибо.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733541
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefirko,

в таком случае непонятно, зачем был нужен массив.

P.S. Не знаю, имеет ли смысл говорить, что имеет смысл изучить теорию вопроса.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733554
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefirko"как эффективнее распилить палку на заготовки нужной длины".

kefirkoЗаготовки должны быть длиной 52, 41, 1, 75, 12мм, а палка к примеру 100мм.
Самым оптимальным укладыванием будет 94мм (ближайшее снизу), т.е. 52+41+1мм.

Лже решение....

При таком подходе (при массовом использовании) останется куча отходов приличной длины,
ибо так на кусок 12 см можно и вообще не выйти, в другом случай 75см ни с чем и никак и останется
25 см...

Правильная постановка задачи:
1. Это есть набор палок (заготовок), возможно даже разной длины.
2. Есть необходимость порезать их на куски (детали) определенной длины (речь о партии).
3. Нужно это сделать так чтобы порезать минимальное количество заготовок и при этом иметь
минимум никчемных обрезков, которые уже ни туда - ни сюда...
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38733576
kefirko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag, это уже другая задача. Для будущих разборов. Потихоньку к этому иду.
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38743782
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefirko, я отвечал как-то на такой вопрос . Там битовые маски, как у тебя, но проще реализация - зачем числа гонять с строки, когда есть битовые операции? )
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38744073
F#
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
F#
Гость
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
// Learn more about F# at http://fsharp.net
// See the 'F# Tutorial' project for more help.
let sourceArray = [52; 41; 1; 75; 12]
let rec allSumsOf xs = 
    if List.isEmpty xs then
        List.Empty
    else
        let head = List.head xs
        let tail = List.tail xs
        let tailSums = allSumsOf tail
        let tailPlusHead = tailSums |> List.map ((+) head)
        
        head :: tailSums @ tailPlusHead

[<EntryPoint>]
let main argv = 
    printfn "%A" (allSumsOf sourceArray |> List.sort)
...
Рейтинг: 0 / 0
Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
    #38744100
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kefirkoПытался разобраться в оптимизации линейного раскроя материалов или по-другому: "как эффективнее распилить палку на заготовки нужной длины". Прог то готовых куча, а вот как они это делают мне как раз и было интересно.
Это частный случай задачи о рюкзаке, упаковать в ограниченный объем вещи с максимальной общей стоимостью. Алгоритмы решения многократно описаны в инете.
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите составить алгоритм перебора всех возможных сумм элементов из исходного массива.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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