Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.233.62] |
|
Сообщ.
#1
,
|
|
|
Прошу помощи.
Есть вектор 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 и тд А как это реализовать в одном алгоритме? |
Сообщ.
#2
,
|
|
|
Перебором битмасок - перебирать все числа от 0 до 2n-1, если соответствующий бит единичный, то элемент, соответствующий этому биту берется.
|
Сообщ.
#3
,
|
|
|
Цитата OpenGL @ Перебором битмасок - перебирать все числа от 0 до 2n-1, если соответствующий бит единичный, то элемент, соответствующий этому биту берется. Спасибо. А если сохранить порядок перебора: сначала просто элементы, потом пары, потом тройки... В моем случае, вроде как алгоритм должен остановиться на пятерках-шестерках |
Сообщ.
#4
,
|
|
|
Тут проще не заморачиваться, а написать 5-6 твоих циклов.
А если хочется для произвольного просто храни счётчик в массиве. Перебор идёт до тех пор пока счётчек в элементе 0 не переполниться тогда просто увеличиваешь +1 элемени с индексом 1 если и он переполнился то увеличиваешь следующий. Это всёравно что суммирование длинного числа с единицей. А вообще тут рост алгоритма экспоненциальный так что перебор вам ещё надо будет оптимизировать. |
Сообщ.
#5
,
|
|
|
Цитата sis12qw @ А если сохранить порядок перебора: сначала просто элементы, потом пары, потом тройки... В моем случае, вроде как алгоритм должен остановиться на пятерках-шестерках Можно генерировать сочетания из n по 2, 3, 4 и т.д. Алгоритм генерации сочетаний есть тут. |
Сообщ.
#7
,
|
|
|
Ура нашел
перебор неповторяющихся комбинаций Скрытый текст #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; } всем лучи добра за подсказки и полезные ссылки |