Здравствуйте.
Есть программа, которая перебирает все варианты размена суммы денег монетами. Подпрограмма реализуется с помощью рекурсии:
Код:
#include <iostream>
#include <string.h>
#include <sstream>
using namespace std;
int totalMoney; // Значение размениваемой суммы
int numberMoney; // Количество купюр
string s = "";
int Banknotes[9] = { 5000, 1000, 500, 100, 50, 10, 5, 2, 1 };
int massBank [1000];
int exchange(int totalMoney, int pos, int lastBanknotes)
{
if(totalMoney == 0)
{
for(int i = 0; i < pos; i++)
{
cout<<massBank[i]<<' ';
}
cout<<endl;
return 0;
}
for(int i = 0; i < 9; i++)
{
if(totalMoney - Banknotes[i] >= 0)
{
massBank[pos] = Banknotes[i];
exchange(totalMoney - Banknotes[i], pos + 1 );
}
}
}
int main()
{
setlocale(0, "rus");
cout<<"Введите значение размениваемой суммы:"<<endl;
cin>>totalMoney;
exchange(totalMoney, 0);
return 0;
}
Необходимо распараллелить подпрограмму, т.е. избавиться от рекурсии.
Есть наработки быдло-кода (естественно не рабочего):
Код:
#include <iostream>
#include <string.h>
#include <sstream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#define n 2000
using namespace std;
struct argThreads // Параметры функции
{
int totalMoney, next;
};
int Banknotes[9] = { 5000, 1000, 500, 100, 50, 10, 5, 2, 1 };
int massBank [1000];
DWORD WINAPI exchange(void * param)
{
int pos = ((argThreads*)param)->next;
int totalMoney = ((argThreads*)param)->totalMoney;
HANDLE hndThreads[n];
argThreads paramForThread[n + 1];
int threadNumber = 0;
if(totalMoney == 0)
{
for(int i = 0; i < pos; i++)
{
cout<<massBank[i]<<' ';
}
cout<<endl;
return 0;
}
for(int i = 0; i < 9; i++)
{
if(totalMoney - Banknotes[i] >= 0)
{
massBank[pos] = Banknotes[i];
paramForThread[threadNumber].totalMoney = totalMoney - Banknotes[i];
paramForThread[threadNumber].next = pos + 1;
hndThreads[threadNumber] = CreateThread(0,0,exchange, (&(paramForThread[threadNumber])),0,0);
threadNumber++;
}
}
for (int i = 0; i < threadNumber; i++)
WaitForSingleObject(hndThreads[i],INFINITE);
}
int main()
{
setlocale(0, "rus");
cout<<"Введите значение размениваемой суммы:"<<endl;
argThreads firstParam;
cin>>firstParam.totalMoney;
firstParam.next = 0;
exchange(&firstParam);
getch();
return 0;
}
Подскажите как это, конкретно для данного примера, вообще реализовать можно?