Это определенно не самое эффективное решение, но, вероятно, с наименьшими усилиями по реализации:
#include <iostream>
#include <vector>
using namespace std;
int n;
pair<int, vector<int> > findMax(int x, int ar[])
{
if (x < n) {
pair<int, vector<int> > max1 = findMax(x + 2, ar);
const pair<int, vector<int> > max2 = findMax(x + 1, ar);
max1.first += ar[x];
max1.second.insert(max1.second.begin(), x);
return max1.first >= max2.first ? max1 : max2;
}
return make_pair(0, vector<int>());
}
ostream& operator<<(ostream &out, const vector<int> &vec)
{
const char *sep = "";
for (int value : vec) {
out << sep << value; sep = ", ";
}
return out;
}
int main()
{
int ar[]={1,7,4,4,9,5,12};
n = sizeof ar / sizeof *ar;
const pair<int, vector<int> > maxAr = findMax(0, ar);
cout << maxAr.first << '\n'
<< maxAr.second << '\n';
return 0;
}
Выход:
28
1, 4, 6
Демонстрация жизни на coliru
Таким образом, возвращаемое значение увеличивается на std::vector<int>
, который содержит используемые индексы рядом с текущей суммой.
std::max()
можно использовать, если я предоставлю подходящий (перегруженный) operator<()
для std::pair<int, std::vector<int> >
. Чтобы не усложнять ситуацию, я просто заменил std::max()
на респ. состояние.