Mythos |
Отправлено: 11.05.2004, 12:17 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 28
|
Может кто знает как исправить функцию или есть какие-то другие предложения?
Есть на форме Edit, CSpinEdit и Memo. В Edit начальное множество, например: {1,2,3,4,5,6}; в CSpinEdit значение какой-то суммы например: 11 и результат(результирующее множество) {1,2,3,5} выводится в Memo.
Нужно реализовать алгоритм BackTracking, тобишь сумируя с начала к первому елементу добавить второй, проверить сумму, если меньше добавить третий елемент, если суммы равны — выход и вывод результатов, если больше вычесть от суммы и из множества текущий и предыдущий елементы и вернуться на шаг назад.
Я попробовал это все тут реализовать(сам бы доделал, но нету времени доделывать — срок поджимает), но работает на половину == можно сказать вообще не работает
Вот моя функция:
CODE |
void __fastcall TAddon::FBackTracking(void)
{
long Summ;
int SummBT=0;
int prevSummBT[1];
int j=0;
Summ=Form1->CSpinEdit1->Value;
TStrings * NumCommaSetIn = new TStringList();
TStrings * NumCommaSetOut = new TStringList();
try
{
NumCommaSetIn->CommaText=Form1->Edit1->Text;
for(int i=0;i<NumCommaSetIn->Count;i++)
{
NumCommaSetOut->Add(NumCommaSetIn->Strings[i]);
prevSummBT[j]=SummBT;
j++;
SummBT+=StrToInt(NumCommaSetIn->Strings[i]);
if(SummBT==Summ)
{
i=NumCommaSetIn->Count;
}
else
{
if(SummBT>Summ)
{
SummBT=prevSummBT[j-1];
NumCommaSetOut->Delete(i);
NumCommaSetOut->Delete(i-1);
i=i-1;
j=j-2;
}
}
//Form1->Memo1->Lines->Add(NumCommaSetOut->CommaText); //output every step
}
//Form1->Memo1->Lines->Add(NumCommaSetOut->CommaText);
Form1->Memo1->Lines->Add("SummBT = "+IntToStr(SummBT));
}
__finally
{
delete NumCommaSetIn;
delete NumCommaSetOut;
}
}
|
Отредактировано Mythos — 11/05/2004, 13:38
|
|
full_lamer |
Отправлено: 11.05.2004, 12:27 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
Я одно время такую прогу мутил, давно это было...
Там я помниться работал с двумя массивами:
первый — числа для суммирования;
второй — индексы (ссылки) на первый массив;
:ссылка
брал последний известный элемент из второго массива,
ссылаюсь по нему на первый,
проверяю сумму,
если идет — беру следующий элемент первого, запониная индекс прошедшего, ...
...
если не идет возвращаюсь во втором массиве назад и наращиваю индекс (ссылку) для первого,
возврат на :ссылка
извини что не в проге, времени нет отлаживать алгоритм... время будет напишу...
|
|
Mythos |
Отправлено: 11.05.2004, 18:19 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 28
|
2full_lamer
втом — то и смысл времени нет , а функция почти рабочая, но не могу понять где и что нетак
|
|
full_lamer |
Отправлено: 12.05.2004, 01:18 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
Вот держи посмотри на мой творений... Извиняй что такой громозкий код, небыло времени на оптимизацию...
|
|
|