And just brute force is no good? http://ideone.com/XcQm0p :
#include <vector> #include <string> #include <iostream> #include <iomanip> #include <numeric> using namespace std; int Count(const vector<int>& x, int sum) { int count = 0; vector<int> a(x.size(),0); for(;;) { int i = 0; if (inner_product(x.begin(),x.end(),a.begin(),0) == sum) { for(int j = 0; j < x.size(); ++j) { for(int k = 0; k < a[j]; ++k) cout << "+" << x[j]; } cout << " = " << sum << endl; ++count; } do { if (a[i]*x[i] <= sum) { a[i]++; break; } else { a[i] = 0; ++i; } } while( i < a.size()); if (i == a.size()) break; }; return count; } int main(int argc, const char * argv[]) { vector<int> x = { 5, 10, 15, 25 }; cout << Count(x,40) << endl; }
#{x,y,z from Z+}:10x+15y+25z=40if you are interested in a short record. - pavel