Формирование портфеля

From
Starikov Alexander ()
To
All
Date
2002-10-25T19:08:37Z
Area
RU.ALGORITHMS
From: "Starikov Alexander" <alex@fnst.spb.ru>

Hello, All!

Есть такая задача - перебрать все возможные комбинации портфеля (в
процентах) заданного кол-ва тикеров.
Наример, если их два, то получить:
100   0
99     1
98     2
...
1       99
0       100

если три, три, то:
100   0   0
99     0   1
...
99     1   0
...
0       0   100

Написал следующую везчь:

std::vector< int > percents; // Массив процентов

  // Инициализация массива процентов
  percents.clear();
  percents.resize(Tickers_Сount, 0); // На кол-во тикеров

 // Заполняем массив процентов
void __fastcall PercentEval(int l)
{
  int sum;
  int j;
  int k = Tickers_Сount; // Кол-во тикеров

  for (int i = 0; i <= 100; i++) // 100%
   {
      percents.at(l) = i;
      sum = 0;
      for (int m = 0; m <= l; m++)
        sum = sum + percents.at(m);
      if (sum > 100)
        exit;
      j = l + 1;
      if (j < k - 1)
          PercentEval(j);
      else
       {
         if (k > 1)
            percents.at(k - 1) = 100 - sum;

         if (percents.at(k - 1) >= 0)  // Массив процентов заполнет
          {
              // комбинация в массиве, можно дальше что-то делать
          }
       }
   }
}

Это работает, только начиная с 4 тикеров данный процесс занимает достаточно
много времени... а если учесть, что после формирования массива идут ещё
вычисления, то это что-то совсем страшно долгое... 4 тикера с последующими
расчётами я так и не дождался - больше часа прошло :((

Как бы оптимизировать, чтобы быстрее перебор шёл и не могу придумать как
сделать меняемый шаг, т.е. не 1% как сейчас а произвольный....



-- 
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
 * Origin: Talk.Mail.Ru (2:5020/400)