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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2017, 12:10   #1
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию Перебрать все возможные варианты

Доброе время суток! Дан массив чисел: massiv[0][1][2] и число Х. Длина массива может быть massiv.Length [1..100]. К числу Х прибавляем все возможные варианты чисел массива. Например:
Х+massiv[0]
Х+massiv[1]
Х+massiv[0]+[0]
Х+massiv[0]+[1]
Х+massiv[0]+[2]
Х+massiv[1]+[1]
Х+massiv[1]+[2]
Х+massiv[2]+[2]
Х+massiv[0]+[1]+[2]
Х+massiv[0]+[0]+[0]
Х+massiv[1]+[1]+[1]
Х+massiv[2]+[2]+[2]
Х+massiv[1]+[1]+[2]
Х+massiv[0]+[0]+[1]
Х+massiv[0]+[0]+[2]
Мучаюсь уже несколько дней. Как это решить алгоритмически?
helpkz вне форума Ответить с цитированием
Старый 26.02.2017, 13:05   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

тройной вложенный цикл вам нужен просто.
for for for
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.02.2017, 13:26   #3
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

А что конкретно хотите сделать?

А общее число таких сочетаний довольно велико.
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 26.02.2017, 13:34   #4
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию

Цитата:
Сообщение от New man Посмотреть сообщение
А что конкретно хотите сделать?
Все что можно сложить. Например: массив[0][1]
x+[0]
x+[1]
x+[0]+[0]
x+[0]+[1]
x+[1]+[1]
Цитата:
Сообщение от New man Посмотреть сообщение
А общее число таких сочетаний довольно велико.
Да, немного погорячился. Ну может так, чтобы не так много времени уходило на расчеты. В общем на сколько возможно.
helpkz вне форума Ответить с цитированием
Старый 26.02.2017, 14:01   #5
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию

Код:
for (int h3 = 0; h3 < sum2_copy.Length; h3++)
            {
                if (sum2[h3] < rr2 - min)
                {
                    for (int h4 = 0; h4 < mas_copy.Length; h4++)
                    {
                            if (mas_copy[h4] < rr2 - sum2[h3])
                            {
                                double del3 = Math.Round(sum2[h3] + mas_copy[h4], 2);
                                if (del3 == rr2)
                                {
                                    textBox_count.Text += "Решение найдено! " + rr2.ToString() + Environment.NewLine;
                                    return;
                                }
                                    for (int h5 = 0; h5 < mas_copy.Length; h5++)
                                    {
                                        if (mas_copy[h5] < rr2 - del3)
                                        {
                                            double del4 = Math.Round(del3 + mas_copy[h5], 2);
                                            if (del4 == rr2)
                                            {
                                                textBox_count.Text += "Решение найдено! " + rr2.ToString() + 
                                                Environment.NewLine;
                                                return;
                                            }
                                                for (int h5_1 = 0; h5_1 < mas_copy.Length; h5_1++)
                                                {
                                                    if (mas_copy[h5_1] < rr2 - del4)
                                                    {
                                                        double del5 = Math.Round(del4 + mas_copy[h5_1], 2);
                                                        if (del5 == rr2)
                                                        {
                                                            textBox_count.Text += "Решение найдено! " + 
                                                            rr2.ToString() + Environment.NewLine;
                                                            return;
                                                        }
                                                            for (int h6 = 0; h6 < mas_copy.Length; h6++)
                                                            {
                                                                if (mas_copy[h6] < rr2 - del5)
                                                                {
                                                                    double del6 = Math.Round(del5 + mas_copy[h6], 2);
                                                                    if (del6 == rr2)
                                                                    {
                                                                        textBox_count.Text += "Решение найдено! " +
                                                                            sum2_copy[h3].ToString() + " " +
                                                                            Environment.NewLine;
                                                                        return;
                                                                    }
                                                                        for (int h7 = 0; h7 < mas_copy.Length; h7++)
                                                                        {
                                                                            if (mas_copy[h7] < rr2 - del6)
                                                                            {
                                                                                double del7 = Math.Round(del6 + mas_copy[h7], 2);
                                                                                if (del7 == rr2)
                                                                                {
                                                                                    textBox_count.Text += "Решение найдено! " +
                                                                                    sum2_copy[h3].ToString() + " " +
                                                                                    Environment.NewLine;
                                                                                    return;
                                                                                }
                                                                            }
                                                                        }
                                                                }
                                                        }
                                                    }
                                            }
                                        }
                                }
                            }
                        }
Сделал до семи, но потом увидел, что может быть больше. Тогда мой код - не вариант. Вдруг будет двадцать значений и надо все будет перебрать. Должен же быть более компактный способ.
helpkz вне форума Ответить с цитированием
Старый 26.02.2017, 14:10   #6
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию

Готов простимулировать ваше решение в виде 600 рублей
helpkz вне форума Ответить с цитированием
Старый 26.02.2017, 22:13   #7
D1amante
 
Регистрация: 01.07.2016
Сообщений: 3
По умолчанию

предложение еще актуально?
D1amante вне форума Ответить с цитированием
Старый 26.02.2017, 23:06   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Вдруг будет двадцать значений и надо все будет перебрать
А ни чего, что для 20 число всех сочетаний с повторениями почти 14*10^10 ?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.02.2017, 19:19   #9
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию

Цитата:
Сообщение от D1amante Посмотреть сообщение
предложение еще актуально?
да, не особо тороплюсь
helpkz вне форума Ответить с цитированием
Старый 27.02.2017, 19:20   #10
helpkz
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 160
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А ни чего, что для 20 число всех сочетаний с повторениями почти 14*10^10 ?
Ну пусть будет меньше, лишь бы вычисления не занимали слишком много времени
helpkz вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
решить - надо перебрать все возможные варианты по 5, чтоб в сумме по модулю 2 получалась 1 Руслан_122 Помощь студентам 2 01.12.2016 02:03
вывести на экран все возможные варианты Oxanita Паскаль, Turbo Pascal, PascalABC.NET 7 08.08.2014 21:55
просчитать все возможные варианты диапазона используя VBA PARTOS Microsoft Office Excel 16 11.10.2010 10:57
Все возможные варианты строки Vikenty Общие вопросы Delphi 3 29.08.2010 03:30
перебрать все варианты перестановки строк sv_mix Помощь студентам 2 26.07.2008 17:48