Перегляньте відео нижче, щоб дізнатися, як встановити наш сайт як веб-програму на головному екрані.
Замітка: This feature may not be available in some browsers.


Korian, так ведь там в любом случае 2^n - n - 1 комбинаций, и наши алгоритмы просто все эти комбинации распределяют по соответствующим группам с одинаковой суммой. Да, есть лишних n пробегов, но для N = 20 это всего лишь 20 проходов из миллиона, несерьезная избыточность.
рано еще делать выводы, еще часа 2 естьКомиссия не признала ни один из алгоритмов
#include <vector>
#include <iostream>
#include <algorithm>
typedef std::vector<unsigned int> UIntVector;
typedef std::vector<UIntVector> UIntVectorVector;
typedef std::vector<UIntVectorVector> UIntVectorVectorVector;
//----------------------------------------------------------------------------------------------------
void FindSummands(const unsigned int number, const unsigned int maxSummand, UIntVectorVectorVector* results)
{
UIntVectorVector& currentResult = (*results)[number];
for (unsigned int lastSummand = maxSummand; lastSummand * (lastSummand + 1) / 2 >= number; --lastSummand)
{
const unsigned int firstSummand = number - lastSummand;
const UIntVectorVector& parentResult = (*results)[firstSummand];
for (UIntVectorVector::const_iterator curResult = parentResult.begin();
curResult != parentResult.end(); ++curResult)
{
if (curResult->back() >= lastSummand)
continue;
currentResult.push_back(*curResult);
currentResult.back().push_back(lastSummand);
}
}
}
UIntVectorVectorVector MakeDescision(const unsigned int n)
{
const unsigned int m = n * (n + 1) / 2;
UIntVectorVectorVector results(m + 1);
for (unsigned int i = 0; i != n + 1; ++i)
results[i].push_back(UIntVector(1, i));
for (unsigned int i = 3; i <= n; ++i)
FindSummands(i, i - 1, &results);
for (unsigned int i = n + 1; i != m + 1; ++i)
FindSummands(i, n, &results);
for (unsigned int i = 0; i != n + 1; ++i)
results[i].erase(results[i].begin());
return results;
}
//----------------------------------------------------------------------------------------------------
bool CompareVectors(const UIntVector& left, const UIntVector& right)
{
if (left.size() < right.size())
return true;
else if (left.size() > right.size())
return false;
for (unsigned int index = 0; index != right.size(); ++index)
{
if (left[index] < right[index])
return true;
else if (left[index] > right[index])
return false;
}
return false;
}
void PrintVector(const UIntVector& vector)
{
for (UIntVector::const_iterator number = vector.begin();
number != vector.end(); ++number)
{
std::cout << *number << " ";
}
std::cout << std::endl;
}
void PrintResults(UIntVectorVectorVector& results)
{
for (unsigned int i = 3; i != results.size(); ++i)
{
std::cout << "------------------------------------- " << i << std::endl;
std::sort(results[i].begin(), results[i].end(), CompareVectors);
std::for_each(results[i].begin(), results[i].end(), PrintVector);
}
}
//----------------------------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
unsigned int n = 9;
PrintResults(MakeDescision(n));
}
currentResult.push_back(*curResult);
currentResult.back().push_back(lastSummand);
currentResult.push_back(*curResult);
currentResult.back().push_back(lastSummand);
counter++;

хороший способ проверки, плохо шо я об этом не подумал.я не вдавался в подробности вашей реализации, просто взял самый глубокий цикл, который нашел, и изменил вот этот кусок
n=20 - 27 секунд.
для оптимизации графа?насчет скорости..
мое решение для 20 - 2.2 секунды. правда, жрет много памяти. неприлично много..
решение кориана для n=20 - 27 секунд. с отключенным выводом, естественно, и не в дебаггерском режиме. видимо, есть почва для оптимизации. плюсы должны быть быстрее джавы, иначе это подорвет основы мироздания. зато жрет мало памяти..
решение Achenar проверить не смог по причине отсутствия полноценной студии. у меня только бесплатная для плюсов стоит.
процессор 3.0ггц

странно как-то, там вывод полностью вырезан?
у меня получается 4 секунды.
Core 2 Duo E6550 2.33GHz
для оптимизации процессов. в том числе, мыслительных. но в свете последних событий оказалось, что уже нет такой почвы, она ушла из под ногstrenzer сказав(ла):для оптимизации графа?
для оптимизации процессов. в том числе, мыслительных. но в свете последних событий оказалось, что уже нет такой почвы, она ушла из под ног