include iostream include cstdlib include ctime include cstdio const wc

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cstdio>
//const wchar_t *message - сообщение таблицы
//double **x - двумерный массив для вывода
//double *a - массив склада
//wchar_t aWchar - название склада
//int aSize - количество элементов в складе
//double *b - массив магазина
//wchar_t bWchar - название магазина
//int bSize - количество элементов в магазине
void Print_table(const wchar_t *message, double **x, double *a, wchar_t aWchar, int aSize, double *b, wchar_t bWchar, int bSize) //функция вывода всего на экран
{
std::wcout << message;
for(int i = 0; i < bSize; i++)
{
std::wcout <<"\t"<< bWchar << b[i];
}
std::wcout <<std::endl;
for(int i = 0; i < aSize; i++)
{
std::wcout << aWchar << a[i];
for(int j = 0; j < bSize; j++)
{
std::wcout <<"\t"<<x[i][j];
}
std::wcout<<std::endl;
}
std::wcout<<std::endl;
}
void Northwest(double* a, int aSize, double* b, int bSize, double** x)
{
double *newA = new double [aSize];
for(int i = 0; i < aSize; i++) // массиву newA присваиваем элементы массива а;
{
newA[i] = a[i];
}
double *newB = new double [bSize];
for(int i = 0; i < bSize; i++)//// массиву newB присваиваем элементы массива b;
{
newB[i] = b[i];
}
int aIndex = 0, bIndex = 0; //индексы равны 0
/*Здесь мы же смотрим если индекс < количества элементов то цикл выполняется.
А в цикле смотрим если индекс массива newA > newB то мы двумерному массиву присваиваем
индексы newb и от newA отнимаем newb и увеличиваем индекс bindex каждый раз */
while(aIndex < aSize && bIndex < bSize)
{
if(newA[aIndex] > newB[bIndex])
{
x[aIndex][bIndex] = newB[bIndex];
newA[aIndex] -= newB[bIndex];
bIndex++;
}
else
{
x[aIndex][bIndex] = newA[aIndex];
newB[bIndex] -= newA[aIndex];
aIndex++;
}
}
delete[]newA;
delete[]newB;
}
double GetFullPrice(int aSize, int bSize, double** x, double** c) //считаем общую стоимость
{
double sum = 0.;
for(int i = 0; i < aSize; i++)
{
for(int j = 0; j < bSize; j++)
{
if(x[i][j] > 0.)
{
sum += x[i][j]*c[i][j];
}
}
}
return sum;
}
void MakeKnownTask() // главная функция
{
double *a, *b, **x, **c;
int aSize = 3, bSize = 5;
int lastASize = aSize;
a = new double[aSize+1];
b = new double[bSize+1];
x = new double *[aSize+1];
c = new double *[aSize+1];
for(int i = 0; i < aSize + 1; i++)
{
x = new double *[aSize+1];
c = new double *[aSize+1];
}
a[0] = 300;
a[1] = 150;
a[2] = 250;
b[0] = 170;
b[1] = 110;
b[2] = 100;
b[3] = 120;
b[4] = 200;
c[0][0] = 70;
c[0][1] = 50;
c[0][2] = 15;
c[0][3] = 80;
c[0][4] = 70;
c[1][0] = 80;
c[1][1] = 90;
c[1][2] = 40;
c[1][3] = 60;
c[1][4] = 85;
c[2][0] = 50;
c[2][1] = 10;
c[2][2] = 90;
c[2][3] = 11;
c[2][4] = 25;
Print_table(L"\tНачальное условие. Таблица стоимостей\n", c, a, 'a', aSize, b, 'b', bSize);
Northwest(a, aSize, b, bSize, x);
Print_table(L"\tНачальное приближение методом северо-западного угла\n", x, a, 'a', aSize, b, 'b', bSize);
//MinimalPricesApproximation(a, aSize, b, bSize, x, c);
//PrintTable(L"\tНачальное приближение методом минимальных стоимостей\n", x, a, 'a', aSize, b, 'b', bSize);
wprintf(L"Общая стоимость: %.f\n", GetFullPrice(aSize, bSize, x, c));
for(int i = 0; i < lastASize + 1; i++)
{
delete[]x[i];
delete[]c[i];
}
delete[]a;
delete[]b;
delete[]x;
delete[]c;
}
int main()
{
int n = 0, m = 0;
setlocale(LC_ALL, "");
wprintf(L"Введите количество складов:");
std::cin >> n;
wprintf(L"Введите количество магазинов:");
std::cin >> m;
void MakeKnownTask();
return 0;
}