Даны N чисел. Нужно расставить + и * между ними и получить максимум.
К примеру - 1,2,3,1,2,3
Ответ - 1+2*3*1*2*3 = 37
Есть ли у Вас идеи, может алгоритмы какие-либо, или статьи с объяснением решения, поделитесь, пожалуйста.
Вы можете использовать рекурсию и сделать это перебором вариантов. Не самая красивая реализация в плане производительности, но в плане читаемости очень даже.
Получится дерево переборов. В листах дерева (когда будет получена полная подстановка знаков) вычисляете выражение и сравниваете с максимумом.
Код будет что-то наподобие такого:
using namespace std;
vector<char> signs = { '+', '-', '*', '%', '/' };
int maxValue = 0;
vector<char> combin;
int calculateExpression(const vector<int> &, const vector<char> &);
void recursiveFunction(const vector<int> & values, vector<char> & combination, size_t level)
{
if(level == combination.size()) // Комбинация сформирована, можно вычислять.
{
int value = calculateExpression(values, combination);
if(value > maxValue) {
combin = combination;
maxValue = value;
}
return;
}
for(int i = 0; i < signs.size(); i++) {
combination[level] = signs[i];
recursiveFunction(values, combination, level + 1);
}
}
int main()
{
vector<int> digits { 1, 2, 3, 4, 5};
vector<char> combinations(digits.size() - 1);
recursiveFunction(digits, combinations, 0);
cout << "Максимальное значение: " << maxValue << endl;
cout << "Комбинация знаков: ";
for(int i = 0; i < combin.size(); ++i) {
cout << digits[i] << " " << combin[i] << " " << digits[i + 1] << " ";
}
cout << endl;
}
Функцию calculateExpression напишите сами. И вектора также исправите на обычные массивы, если нужно.
Что касается вычисления выражения, то здесь вам в помощь обратная польская запись. Реализуется просто, статей предостаточно.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости