Here is a simple recursive version:
#include <vector>
#include <iostream>
using namespace std;
void gps(const vector< vector<double> >& data, size_t i=0, double s=0) {
if (i == data.size())
cout << s << endl;
else
for (auto v : data[i])
gps(data, i + 1, s + v);
}
int main() {
vector< vector<double> > data = { {4.0, 9.5, 6.8},
{3.2, 2.1, 7.8, 9.0}, {5.8, 9.1}, {5.4}, {5.6, 7.2}};
gps(data);
return 0;
}
And the version without recursion:
#include <vector>
#include <iostream>
using namespace std;
void gps2(const vector< vector<double> >& data) {
size_t perms = 1;
for (auto v : data)
perms *= v.size();
for (int i = 0; i < perms; ++i) {
double s = 0;
size_t tmp = i;
for (int j = data.size() - 1; j >= 0; --j) {
size_t k = tmp % data[j].size();
tmp /= data[j].size();
s += data[j][k];
}
cout << s << endl;
}
}
int main() {
vector< vector<double> > data = { {4.0, 9.5, 6.8},
{3.2, 2.1, 7.8, 9.0}, {5.8, 9.1}, {5.4}, {5.6, 7.2}};
gps2(data);
return 0;
}
source
share