C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Алгоритм BackTracking, функция работает на половину
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, тобишь сумируя с начала к первому елементу добавить второй, проверить сумму, если меньше добавить третий елемент, если суммы равны — выход и вывод результатов, если больше вычесть от суммы и из множества текущий и предыдущий елементы и вернуться на шаг назад.

Я попробовал это все тут реализовать(сам бы доделал, но нету времени доделывать — срок поджимает), но работает на половину == можно сказать вообще не работает sad.gif

QUOTE
Помогите pls.


Вот моя функция:

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
втом — то и смысл времени нет wink.gif , а функция почти рабочая, но не могу понять где и что нетак sad.gif
full_lamer
Отправлено: 12.05.2004, 01:18


Машинист паровоза

Группа: Участник
Сообщений: 225



Вот держи посмотри на мой творений... Извиняй что такой громозкий код, небыло времени на оптимизацию...

User Attached Image Скачать файл
005.zip



Вернуться в Вопросы программирования в C++Builder