4
bool findans(vector<set<int>> &dp, vector<int> &nums, int start, int sum, int bitcnt) {5
if (start == nums.size()) {6
for (int i = 0; i < dp.size(); i++)7
if (i + bitcnt != 0 && i + bitcnt != nums.size() &&8
((i + bitcnt) * totsum) % nums.size() == 0 &&9
dp[i].find((((i + bitcnt) * totsum) / nums.size()) - sum) != dp[i].end())13
return findans(dp, nums, start + 1, sum, bitcnt) ||14
findans(dp, nums, start + 1, sum + nums[start], bitcnt + 1);17
void filldp(vector<set<int>> &dp, vector<int> &nums, int start, int mask) {18
if (start == nums.size() / 2) {20
for (int i = 0; i < nums.size(); i++)21
if (mask & (1 << i)) {28
filldp(dp, nums, start + 1, mask);29
filldp(dp, nums, start + 1, mask ^ (1 << start));32
bool splitArraySameAverage(vector<int> &nums) {34
for (int i = 0; i < nums.size(); i++) totsum += nums[i];35
vector<set<int>> dp(nums.size() / 2 + 1);36
filldp(dp, nums, 0, 0);37
return findans(dp, nums, nums.size() / 2, 0, 0);