Я учусь о максимизации с линейным программированием, и наткнулся алгоритм максимизации с двумя переменными (серебра и золота в данном случае), но я не уверен, что определенный часть кода делает:C++ Алгоритм решения максимизации линейного программирование
using namespace std;
class PreciousStones {
int n;
vector<int> as;
vector<int> ag;
функция ниже раздел Я неясными на:
double maxg (double s) {
double g = 0;
for (int i=0; i<n; i++)
if (s == 0)
g += ag[i];
else if (as[i] <= s)
s -= as[i];
else {
g += (1-s/as[i])*ag[i];
s = 0;
}
return g;
}
остальная часть кода ниже (для с КОНТЕКСТ), если кто-нибудь знает о некоторых соответствующих документов по этому алгоритму, или может дать краткое объяснение этой функции я оценил бы его сильно
public:
double value(vector <int> silver, vector <int> gold) {
n = silver.size();
as = silver;
ag = gold;
for (int i=0; i<n; i++)
for (int j=i+1; j<n; j++)
if (as[j]*ag[i] > as[i]*ag[j]) {
swap(as[i], as[j]);
swap(ag[i], ag[j]);
}
double lo = 0;
double hi = 51*100;
double D = 1e-10;
while (lo+D < hi && lo*(1+D) < hi) {
double mid = (lo+hi)/2;
if (mid <= maxg(mid))
lo = mid;
else
hi = mid;
}
return lo;
}
};
Спасибо за подсказку Hal, для меня это выглядит как жадный алгоритм больше, чем симплексный алгоритм –
Два массива - подумайте об этом как о массиве структуры с двумя значениями. Сортировка по продукту этих двух значений. Двоичный поиск с низким нолем и высоким значением, инициализированным магическим числом. Отбросьте все значения серебра и золота, где серебро суммируется до испытательного значения. Умножьте остаток по золоту в качестве стартового значения для стоимости, суммируйте остаток золота и добавьте. Максимизируйте золото сначала, а затем, учитывая, что забрать все остаточное серебро, которое вы можете смотреть, это то, что он пытается сделать. – Hal
Хорошо круто, спасибо большое :), что имеет смысл –