Давайте сосредоточимся на проблеме печати всех подмножеств. Как вы знаете, если у вас есть вектор n
элементов, у вас будет 2^n
возможных подмножеств. Неслучайно, если у вас есть n
-битное целое число, максимальное сохраненное значение равно 2^n
. Если вы рассматриваете каждое целое число как вектор битов, то итерирование по всем возможным значениям даст все возможные подмножества битов. Ну, у нас есть подмножества бесплатно, итерируя целое число!
Предполагая, что вектор содержит не более 32 элементов (более 4 миллиардов возможных подмножеств!), Этот фрагмент кода напечатает все подмножества вектора v
(исключая пустой):
for (uint32_t mask =1; mask < (1<<v.size()); ++mask)
{
std::vector<int>::const_iterator it = v.begin();
for (uint32_t m =mask; m; (m>>=1), ++it)
{
if (m&1) std::cout << *it << " ";
}
std::cout << std::endl;
}
Я просто создаю все возможные битовые маски для размера вектора и перебираю каждый бит; если он установлен, я печатаю соответствующий элемент.
Теперь применение правила окончания с каким-то конкретным числом - это кусок пирога (путем проверки дополнительных условий при циклическом просмотре масок). Предпочтительно, если в вашем векторе есть только один 5 , вы можете поменять его местами до конца и распечатать все подмножества вектора без последнего элемента.
Я эффективно использую std::vector
, const_iterator
и std::cout
, так что вы можете подумать, что это решается с помощью STL. Если я придумаю что-нибудь более STLish, я дам вам знать (ну, но как, это просто повторение). Вы можете использовать эту функцию в качестве эталона для ваших решений STL, хотя; -)
РЕДАКТИРОВАТЬ: Как отметил Йорген Фог, он не решает ваши подмножества блюза, если вы хотите работать с большими векторами. На самом деле, если вы хотите распечатать все подмножества для 32 элементов, он будет генерировать терабайты данных. Вы можете использовать 64-битное целое число, если вы чувствуете себя ограниченным константой 32, но вы даже не закончите итерацию по всем числам. Если ваша проблема состоит в том, чтобы просто ответить на количество желаемых подмножеств, вам определенно нужен другой подход. И STL тоже не сильно поможет; -)