На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Алгоритм перебора пар, троек, четверок и тд элементов , как лучше реализовать
    Прошу помощи.
    Есть вектор N действительных значений. A = [a1, a2, ... an]
    Как лучше реализовать универсальный перебор различных комбинаций элементов(пары, двойк, тройки, четверки, пятерки и тд.) на проверку условия? Например, сумма элементов комбинации равна 1.

    Если, перебор комбинаций из одного элемента вектора - это 1 цикл вида: for i=1 to N if a[i]=1 then... )
    Если перебор комбинаций пар элементов, то нужен двойной вложенный цикл (for i=1 to N for j=i to N if a[i]+a[j]=1 then...)
    Если, перебор комбинаций троек элеметов, то 3й вложеный цикл: for i=1 to N for j=i to N for k=j to N if a[i]+a[j]+a[k]=1
    и тд

    А как это реализовать в одном алгоритме?
      Перебором битмасок - перебирать все числа от 0 до 2n-1, если соответствующий бит единичный, то элемент, соответствующий этому биту берется.
        Цитата OpenGL @
        Перебором битмасок - перебирать все числа от 0 до 2n-1, если соответствующий бит единичный, то элемент, соответствующий этому биту берется.

        Спасибо.

        А если сохранить порядок перебора: сначала просто элементы, потом пары, потом тройки...
        В моем случае, вроде как алгоритм должен остановиться на пятерках-шестерках
          Тут проще не заморачиваться, а написать 5-6 твоих циклов.

          А если хочется для произвольного просто храни счётчик в массиве. Перебор идёт до тех пор пока счётчек в элементе 0 не переполниться тогда просто увеличиваешь +1 элемени с индексом 1 если и он переполнился то увеличиваешь следующий. Это всёравно что суммирование длинного числа с единицей.

          А вообще тут рост алгоритма экспоненциальный так что перебор вам ещё надо будет оптимизировать.
            Цитата sis12qw @
            А если сохранить порядок перебора: сначала просто элементы, потом пары, потом тройки...
            В моем случае, вроде как алгоритм должен остановиться на пятерках-шестерках

            Можно генерировать сочетания из n по 2, 3, 4 и т.д. Алгоритм генерации сочетаний есть тут.
                Ура нашел :)

                перебор неповторяющихся комбинаций
                Скрытый текст

                #include <iostream>
                #include <vector>

                using std::vector;
                using std::cin;
                using std::cout;
                using std::endl;

                int n, k;
                vector<int> v;

                void comb(int num)
                {
                if(num > k)
                {
                for(int i=1; i<=k; i++)
                cout << v[i];
                cout << endl;
                return;
                }
                v[num] = v[num-1]+1;
                while(v[num] <= n)
                {
                comb(num+1);
                v[num]++;
                }
                return;
                }


                int main(void)
                {
                cin >> n >> k;
                v.resize(k+1);
                v[0]=0;
                comb(1);
                return 0;
                }


                всем лучи добра за подсказки и полезные ссылки :)
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0239 ]   [ 14 queries used ]   [ Generated: 22.05.24, 04:18 GMT ]