#include <bits/stdc++.h>
using namespace std;
bool SubsetSum(vector<int> &A, int Sum)
{
bool dp[Sum+1][A.size()+1];
int i, j;
for(i=0; i<= A.size(); i++)
dp[0][i] = false; // When sum = 0
for(i=0; i<=Sum; i++)
dp[i][0] = 1; // When num of elements = 0
for(i = 1; i <= A.size(); i++)
{
for(j=1; j<= Sum; j++)
{
dp[i][j] = dp[i-1][j];
if(j-A[i-1] >= 0)
dp[i][j] = dp[i][j] || dp[i-1][j-A[i-1]];
}
}
return dp[Sum][A.size()];
}
void avgset(vector<int> &A) {
int total = accumulate(A.begin(), A.end(), 0);
int ntotal = A.size();
int i;
for(i=1; i<=ntotal; i++) // Number of elements in the subset
{
if((total * i) % ntotal == 0)
{
if(SubsetSum(A, (total * i)/ntotal))
cout<<"Array can be broken into 2 arrays each with equal average of "<<(total * i)/ntotal<<endl;
}
}
}
int main()
{
vector<int> A = {1, 7, 15, 29, 11, 9};
avgset(A);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKYm9vbCBTdWJzZXRTdW0odmVjdG9yPGludD4gJkEsIGludCBTdW0pCnsKCWJvb2wgZHBbU3VtKzFdW0Euc2l6ZSgpKzFdOwoJaW50IGksIGo7Cglmb3IoaT0wOyBpPD0gQS5zaXplKCk7IGkrKykKCQlkcFswXVtpXSA9IGZhbHNlOyAvLyBXaGVuIHN1bSA9IDAKCWZvcihpPTA7IGk8PVN1bTsgaSsrKQoJCWRwW2ldWzBdID0gMTsgLy8gV2hlbiBudW0gb2YgZWxlbWVudHMgPSAwCglmb3IoaSA9IDE7IGkgPD0gQS5zaXplKCk7IGkrKykKCXsKCQlmb3Ioaj0xOyBqPD0gU3VtOyBqKyspCgkJewoJCQlkcFtpXVtqXSA9IGRwW2ktMV1bal07CgkJCWlmKGotQVtpLTFdID49IDApCgkJCQlkcFtpXVtqXSA9IGRwW2ldW2pdIHx8IGRwW2ktMV1bai1BW2ktMV1dOwoJCX0KCX0KCXJldHVybiBkcFtTdW1dW0Euc2l6ZSgpXTsKfQoKdm9pZCBhdmdzZXQodmVjdG9yPGludD4gJkEpIHsKCWludCB0b3RhbCA9IGFjY3VtdWxhdGUoQS5iZWdpbigpLCBBLmVuZCgpLCAwKTsKCWludCBudG90YWwgPSBBLnNpemUoKTsKCglpbnQgaTsKCWZvcihpPTE7IGk8PW50b3RhbDsgaSsrKSAvLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHN1YnNldAoJewoJCWlmKCh0b3RhbCAqIGkpICUgbnRvdGFsID09IDApCgkJewoJCQlpZihTdWJzZXRTdW0oQSwgKHRvdGFsICogaSkvbnRvdGFsKSkKCQkJCWNvdXQ8PCJBcnJheSBjYW4gYmUgYnJva2VuIGludG8gMiBhcnJheXMgZWFjaCB3aXRoIGVxdWFsIGF2ZXJhZ2Ugb2YgIjw8KHRvdGFsICogaSkvbnRvdGFsPDxlbmRsOwoJCX0KCX0KfQoKaW50IG1haW4oKQp7Cgl2ZWN0b3I8aW50PiBBID0gezEsIDcsIDE1LCAyOSwgMTEsIDl9OwoJYXZnc2V0KEEpOwoJcmV0dXJuIDA7Cn0=