Другие языки программирования и технологии

Задача рюкзак С++

Написать решение задачи о рюкзаке. Емкость рюкзака 25 кг. 12 предметов. Ценность и вес задать случайно от 1 до 8. Сформировать максимально ценный рюкзак. Один предмет можно брать один раз. Все этапы работы программы выводить в консоль.

Вот мой код, но в нём есть ошибки. Помогите их решить, пожалуйста!

using namespace std;
class predmet
{
public:
int ves, price;
bool in;
double ratio;
predmet()
{
in = false;
ves = rand() % 8 + 1;
price = rand() % 8 + 1;
ratio = price /ves;
};
};

class portfel
{
public:
predmet p[12];
int weight;

portfel()
{
for (int i = 0; i < 12; i++)
{
p[i] = predmet();
weight = 0;
};
};

double maxratio()
{
double max = 0;
for (int i = 0; i < 12; i++)
{
if (p[i].ratio > max) max = p[i].ratio;
};
return max;
};

// засовывает максимально выгодный предмет и обнуляет его ценность если он не лезет
void putmax()
{
double max = maxratio();
for (int i = 0; i < 12; i++)
{
if (p[i].ratio = max)
{
if (weight + p[i].ves > 25) { p[i].ratio = 0; }
else { p[i].in = true; weight += p[i].ves };
};
};

};
};

main()
void Predmet(float P[12], float V[12], float PV[12]) // заполнение массива предметов
{
int x, y, z;
for (x = 0; x < 12; x++)
{
P[x] = rand() % 8 + 1; // ценность предмета
V[x] = rand() % 8 + 1; // Вес предмета
PV[x] = P[x] / V[x]; // Удельная ценность предмета
}
}

void Vivod(float* P, float* V, float* PV, int N)
{
int x;
cout << endl << "Цена\t" << "Вес\t" << "Уд. цен." << endl;
for (x = 0; x < N; x++)
{
cout << P[x] << "\t" << V[x] << "\t" << PV[x] << endl;
}
}

void Greedy(float P[12], float V[12], float PV[12], int N, float Emk) // жадный алгоритм
{
int x, y, k = 0; // k - кол-во предметов
float buf1, buf2, buf3, SumV = 0, SumP = 0;
for (x = 0; x < N - 1; x++)
for (y = x + 1; y < N; y++)
{
if (PV[x] < PV[y] || PV[x] == PV[y] && V[x] < V[y])
{
buf1 = P[x];
P[x] = P[y];
P[y] = buf1;

buf2 = V[x];
V[x] = V[y];
V[y] = buf2;

buf3 = PV[x];
PV[x] = PV[y];
PV[y] = buf3;

}
}
cout << "Отсортированный список предметов:";
Vivod(P, V, PV, N);
for (x = 0; x < N; x++)
{
if (SumV + V[x] <= Emk)
{
SumV += V[x];
SumP += P[x];
k++;
}
else break;
}
for (y = 0; y < N; y++)
{
if (SumV + V[y] <= Emk)
{
SumV += V[y];
SumP += P[y];
k++;
}
else break;
}
cout << "Ответ:";
Vivod(P, V, PV, k);
cout << "Кол-во предметов: " << k << endl << "Общий вес предметов: " << SumV << endl << "Общая ценность " << SumP;
}

int main()
{
float Ves[12], Price[12], UdPr[12]; // Price - ценность предмета Ves - вес предмета UdPr - удельная ценность
setlocale(LC_ALL, "Russian");
srand(time(NULL));
Predmet(Price, Ves, UdPr);
cout << "Список предметов:";
Vivod(Price, Ves, UdPr, 12);
Greedy(Price, Ves, UdPr, 12, 25);
}
Чекни

#include <iostream // закроешь скобки, с ними не вставляется
#include <random
#include <ctime
using namespace std;
class predmet
{
public:
int ves, price;
bool in;
double ratio;
predmet()
{
in = false;
ves = rand() % 8 + 1;
price = rand() % 8 + 1;
ratio = price / ves;
};
};

class portfel
{
public:
predmet p[12];
int weight;

portfel()
{
for (int i = 0; i < 12; i++)
{
p[i] = predmet();
weight = 0;
};
};

double maxratio()
{
double max = 0;
for (int i = 0; i < 12; i++)
{
if (p[i].ratio > max) max = p[i].ratio;
};
return max;
};

// засовывает максимально выгодный предмет и обнуляет его ценность если он не лезет
void putmax()
{
double max = maxratio();
for (int i = 0; i < 12; i++)
{
if (p[i].ratio = max)
{
if (weight + p[i].ves > 25) { p[i].ratio = 0; }
else { p[i].in = true; weight += p[i].ves; };
};
};

};
};

void Predmet(float P[12], float V[12], float PV[12]) // заполнение массива предметов
{
int x, y, z;
for (x = 0; x < 12; x++)
{
P[x] = rand() % 8 + 1; // ценность предмета
V[x] = rand() % 8 + 1; // Вес предмета
PV[x] = P[x] / V[x]; // Удельная ценность предмета
}
}

void Vivod(float* P, float* V, float* PV, int N)
{
int x;
cout << endl << "Цена\t" << "Вес\t" << "Уд. цен." << endl;
for (x = 0; x < N; x++)
{
cout << P[x] << "\t" << V[x] << "\t" << PV[x] << endl;
}
}

void Greedy(float P[12], float V[12], float PV[12], int N, float Emk) // жадный алгоритм
{
int x, y, k = 0; // k - кол-во предметов
float buf1, buf2, buf3, SumV = 0, SumP = 0;
for (x = 0; x < N - 1; x++)
for (y = x + 1; y < N; y++)
{
if (PV[x] < PV[y] || PV[x] == PV[y] && V[x] < V[y])
{
buf1 = P[x];
P[x] = P[y];
P[y] = buf1;

buf2 = V[x];
V[x] = V[y];
V[y] = buf2;

buf3 = PV[x];
PV[x] = PV[y];
PV[y] = buf3;

}
}
cout << "Отсортированный список предметов:";
Vivod(P, V, PV, N);
for (x = 0; x < N; x++)
{
if (SumV + V[x] <= Emk)
{
SumV += V[x];
SumP += P[x];
k++;
}
else break;
}
for (y = 0; y < N; y++)
{
if (SumV + V[y] <= Emk)
{
SumV += V[y];
SumP += P[y];
k++;
}
else break;
}
cout << "Ответ:";
Vivod(P, V, PV, k);
cout << "Кол-во предметов: " << k << endl << "Общий вес предметов: " << SumV << endl << "Общая ценность " << SumP;
}

int main()
{
float Ves[12], Price[12], UdPr[12]; // Price - ценность предмета Ves - вес предмета UdPr - удельная ценность
setlocale(LC_ALL, "Russian");
srand(time(NULL));
Predmet(Price, Ves, UdPr);
cout << "Список предметов:";
Vivod(Price, Ves, UdPr, 12);
Greedy(Price, Ves, UdPr, 12, 25);
system("pause");
}
Женя Дементьев
Женя Дементьев
2 021
Лучший ответ
Витя Крюков запустил вариант от backot
Список предметов:
ЦенаВесУд. цен.
871.14286
641.5
431.33333
441
723.5
180.125
260.333333
260.333333
422
313
616
541.25
Отсортированный список предметов:
ЦенаВесУд. цен.
616
723.5
313
422
641.5
431.33333
541.25
871.14286
441
260.333333
260.333333
180.125
Ответ:
ЦенаВесУд. цен.
616
723.5
313
422
641.5
431.33333
541.25
871.14286
441
Кол-во предметов: 9
Общий вес предметов: 25
Общая ценность 49
Саня Гордеев спасибо. у вас работает? всё в порядке?
все предметы берутся?
52:42: error: expected ';' before '}' token
else { p[i].in = true; weight += p[i].ves };
_____________________________^ пропущена ;
ВК
Витя Крюков
73 094
Витя Крюков Список предметов:
ЦенаВесУд. цен.
871.14286
641.5
431.33333
441
723.5
180.125
260.333333
260.333333
422
313
616
541.25
Отсортированный список предметов:
ЦенаВесУд. цен.
616
723.5
313
422
641.5
431.33333
541.25
871.14286
441
260.333333
260.333333
180.125
Ответ:
ЦенаВесУд. цен.
616
723.5
313
422
641.5
431.33333
541.25
871.14286
441
Кол-во предметов: 9
Общий вес предметов: 25
Общая ценность 49