//---------------------------------------------------------------------------

#pragma hdrstop
#include <iostream.h>
#include <conio.h>
using namespace std;

//---------------------------------------------------------------------------

int line = 0;
int N[1225][50];                          //tablica przechowujaca bierzace otoczenie

//---------------------------------------------------------------------------

void drukuj(const int *v, const int n)    //funkcja wyswietlajaca, i zapisujaca zbior permutacji
{
  if (v != 0)
  {
    for (int k = 0; k < n; k++)
    {
      N[line][k] = v[k];
      //cout << N[line][k]+1 << " " ;
    }
    //cout << endl;
    line++;
  }
}

//---------------------------------------------------------------------------

int otoczenie(int n, int *v)              //funkcja generujaca otoczenie rozwiazania
{
  int tmp = 0;
  for (int i=0; i<(n * (n - 1))/2; i++)
    {
    for(int j=i+1; j<=n-1; j++)
      {
       tmp = v[i];
       v[i] = v[j];
       v[j] = tmp;
       drukuj(v, n);
       tmp = v[i];
       v[i] = v[j];
       v[j] = tmp;
  }
}
return 0;
};

//---------------------------------------------------------------------------

int maks(int T)
{
if (T > 0)
  return T;
else
  return 0;
}

//---------------------------------------------------------------------------

/*void Fcelu(const int n, int *N, int *t, int *d)
{
 long int c = 0;                                //zmienna przechowujaca czas zakonczenia zadania
 long int T;                                    //zmienna przechowujaca czas opuznienia zadania
 long int F = 0;                                //zmienna przechowujaca wartosc funkcji celu
 long int F_opt = 1000000;                      //zmienna przechowujaca optymalna wartosc funkcji celu
 long int perm_opt;                             //zmienna przechowujaca numer wiersza tablicy N,
                                                //w ktorej znajduje sie permutacja o optymalnej wratosci funkcji celu
  for (int a = 0; a < n*(n-1)/2; a++)
    {
      for (int b = 0; b < n; b++)
      {
       c = c + t[N[a][b]];
       T = maks(c - d[N[a][b]]);
       F = F + T * w[N[a][b]];
      }
      if (F_opt > F)
      {
       F_opt = F;
       perm_opt =a ;
      }
      c = 0;
      F = 0;
    }
}
  */
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{

//--------------------inicjalizacja zmienych pomocniczych--------------------

 int n;
 int v[50];                                     //wektor pomocniczy
 int t[50];                                     //tablica przechowujaca czasy wkonywania poszczegolonych zadan
 int w[50];                                     //tablica przechowujaca wagi poszczegolnych zadan
 int d[50];                                     //tablica przechowujaca deadline`y poszczegolnych zadan
 long int c = 0;                                //zmienna przechowujaca czas zakonczenia zadania
 long int T;                                    //zmienna przechowujaca czas opuznienia zadania
 long int F = 0;                                //zmienna przechowujaca wartosc funkcji celu
 long int F_opt = 1000000;                      //zmienna przechowujaca optymalna wartosc funkcji celu
 long int perm_opt;                             //zmienna przechowujaca numer wiersza tablicy N,
                                                //w ktorej znajduje sie permutacja o optymalnej wratosci funkcji celu

//--------------------------wypelnieie wektora v[i]--------------------------

 for (int i=0; i<50; i++)
   {
    v[i] = i;
    //cout << "v[" << i << "]= " << v[i] << endl;
   }

//-------------------wprowadzenie danych przez uzytkownika-------------------

Etykieta:

 clrscr();
  cout << "Prosze wprowadzic liczbe zadan (2-50):";
  cin >> n ;
  cout << endl ;

 if (n<51)
 {
  for (int l = 0; l<n; l++)
  {
    cout << "Prosze wprowadzic czas wykonania zadania nr." << l + 1 << ": ";
    cin >> t[l];
    cout <<endl;

    cout << "Prosze wprowadzic wage zadnia nr." << l + 1 << ": ";
    cin >> w[l];
    cout <<endl;

    cout << "Prosze wprowadzic deadline zadania nr." << l + 1 << ": ";
    cin >> d[l];
    cout <<endl;

    clrscr();
  }

  clrscr();

  for(int m=0; m<n; m++)
  {
    cout << "Zadanie nr." << m+1 << ": " << endl;
    cout << "     - czas wykonania t" << m + 1 << ": " << t[m] << endl;
    cout << "     - waga w" << m + 1 << ": " << w[m] << endl;
    cout << "     - deadline d" << m + 1 << ": " << d[m] << endl;
    cout << endl;
  }

//---------------------------------------------------------------------------

     for(int g=0; g<50; g++)
     {
        otoczenie(n, v);

        for (int a = 0; a < n*(n-1)/2; a++)
          {
            for (int b = 0; b < n; b++)
            {
             c = c + t[N[a][b]];
             T = maks(c - d[N[a][b]]);
             F = F + T * w[N[a][b]];
            }
            if (F_opt > F)
            {
             F_opt = F;
             perm_opt =a ;
            }
            c = 0;
            F = 0;
            }
        for (int i =0; i<n; i++)
        {
         v[i] = N[perm_opt][i];
         cout << v[i]+1;
        }
         cout << endl;
        line =0;
     }
          cout << endl;
          cout << "Optymalna kolejnosc wykonania zadan to:" << endl;
          for (int h = 0; h < n; h++)
          {
            cout << N[perm_opt][h] + 1 << "  " ;
          }

         /*cout << endl;

         for(int i = 0; i<(n*(n-1)/2); i++)
         {
          for(int j=0; j<n; j++ )
            {
             cout << N[i][j]+1 << " ";
            }
             cout << endl;
         }*/

 }
 else
 {
  cout << endl;
  cout << "Wprowadzona liczba zadan jest za duza!!" << endl;
  cout << "Wcisnij dowolny klawisz..." << endl;
  getch();
  goto Etykieta;
 }

        cout << endl;
        cout << "Wcisnij dowolny klawisz..." << endl;
        getch();
        return 0;
}
//---------------------------------------------------------------------------
