//
// main.cpp
// Subset Sum Using Meet in the Middle
//
//
//
#include <bits/stdc++.h>
using namespace std;
// Function to generate all possible subset sums
void generateSubsetSums(const vector<int>& nums, vector<int>& subsetSums) {
int n = (int) nums.size();
int totalSubsets = 1 << n; // 2^n subsets
for (int mask = 1; mask < totalSubsets; mask++) {
int sum = 0;
for (int j = 0; j < n; j++) {
if (mask & (1 << j)) { // If j-th element is in the subset
sum += nums[j];
}
}
subsetSums.push_back(sum);
}
}
bool meetInTheMiddleSubsetSum(vector<int>& nums, int target) {
int n = (int) nums.size();
int mid = n / 2;
// Divide the array into two halves
vector<int> left(nums.begin(), nums.begin() + mid);
vector<int> right(nums.begin() + mid, nums.end());
// Generate all subset sums for both halves
vector<int> leftSums, rightSums;
generateSubsetSums(left, leftSums);
generateSubsetSums(right, rightSums);
// Sort leftSums and rightSums to use binary search
sort(leftSums.begin(), leftSums.end());
sort(rightSums.begin(), rightSums.end());
// Check if a subset sum from left half only or right half only equals target
if (binary_search(leftSums.begin(), leftSums.end(), target) ||
binary_search(rightSums.begin(), rightSums.end(), target)) {
return true;
}
// Check if any subset sum from leftSums matches with rightSums to form target
for (int sum : leftSums) {
int required = target - sum;
if (binary_search(rightSums.begin(), rightSums.end(), required)) {
return true;
}
}
return false;
}
int main() {
vector<int> nums = {3, 4, 8, 2};
int target = 10;
if (meetInTheMiddleSubsetSum(nums, target)) {
cout << "Subset with target sum exists" << endl;
} else {
cout << "No subset with target sum found" << endl;
}
return 0;
}
Ly8KLy8gIG1haW4uY3BwCi8vICBTdWJzZXQgU3VtIFVzaW5nIE1lZXQgaW4gdGhlIE1pZGRsZQovLwovLwovLwojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIEZ1bmN0aW9uIHRvIGdlbmVyYXRlIGFsbCBwb3NzaWJsZSBzdWJzZXQgc3Vtcwp2b2lkIGdlbmVyYXRlU3Vic2V0U3Vtcyhjb25zdCB2ZWN0b3I8aW50PiYgbnVtcywgdmVjdG9yPGludD4mIHN1YnNldFN1bXMpIHsKICAgIGludCBuID0gKGludCkgbnVtcy5zaXplKCk7CiAgICBpbnQgdG90YWxTdWJzZXRzID0gMSA8PCBuOyAvLyAyXm4gc3Vic2V0cwoKICAgIGZvciAoaW50IG1hc2sgPSAxOyBtYXNrIDwgdG90YWxTdWJzZXRzOyBtYXNrKyspIHsKICAgICAgICBpbnQgc3VtID0gMDsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICBpZiAobWFzayAmICgxIDw8IGopKSB7IC8vIElmIGotdGggZWxlbWVudCBpcyBpbiB0aGUgc3Vic2V0CiAgICAgICAgICAgICAgICBzdW0gKz0gbnVtc1tqXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzdWJzZXRTdW1zLnB1c2hfYmFjayhzdW0pOwogICAgfQp9Cgpib29sIG1lZXRJblRoZU1pZGRsZVN1YnNldFN1bSh2ZWN0b3I8aW50PiYgbnVtcywgaW50IHRhcmdldCkgewogICAgaW50IG4gPSAoaW50KSBudW1zLnNpemUoKTsKICAgIGludCBtaWQgPSBuIC8gMjsKCiAgICAvLyBEaXZpZGUgdGhlIGFycmF5IGludG8gdHdvIGhhbHZlcwogICAgdmVjdG9yPGludD4gbGVmdChudW1zLmJlZ2luKCksIG51bXMuYmVnaW4oKSArIG1pZCk7CiAgICB2ZWN0b3I8aW50PiByaWdodChudW1zLmJlZ2luKCkgKyBtaWQsIG51bXMuZW5kKCkpOwoKICAgIC8vIEdlbmVyYXRlIGFsbCBzdWJzZXQgc3VtcyBmb3IgYm90aCBoYWx2ZXMKICAgIHZlY3RvcjxpbnQ+IGxlZnRTdW1zLCByaWdodFN1bXM7CiAgICBnZW5lcmF0ZVN1YnNldFN1bXMobGVmdCwgbGVmdFN1bXMpOwogICAgZ2VuZXJhdGVTdWJzZXRTdW1zKHJpZ2h0LCByaWdodFN1bXMpOwoKICAgIC8vIFNvcnQgbGVmdFN1bXMgYW5kIHJpZ2h0U3VtcyB0byB1c2UgYmluYXJ5IHNlYXJjaAogICAgc29ydChsZWZ0U3Vtcy5iZWdpbigpLCBsZWZ0U3Vtcy5lbmQoKSk7CiAgICBzb3J0KHJpZ2h0U3Vtcy5iZWdpbigpLCByaWdodFN1bXMuZW5kKCkpOwogICAgCiAgICAvLyBDaGVjayBpZiBhIHN1YnNldCBzdW0gZnJvbSBsZWZ0IGhhbGYgb25seSBvciByaWdodCBoYWxmIG9ubHkgZXF1YWxzIHRhcmdldAogICAgaWYgKGJpbmFyeV9zZWFyY2gobGVmdFN1bXMuYmVnaW4oKSwgbGVmdFN1bXMuZW5kKCksIHRhcmdldCkgfHwKICAgICAgICBiaW5hcnlfc2VhcmNoKHJpZ2h0U3Vtcy5iZWdpbigpLCByaWdodFN1bXMuZW5kKCksIHRhcmdldCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyBDaGVjayBpZiBhbnkgc3Vic2V0IHN1bSBmcm9tIGxlZnRTdW1zIG1hdGNoZXMgd2l0aCByaWdodFN1bXMgdG8gZm9ybSB0YXJnZXQKICAgIGZvciAoaW50IHN1bSA6IGxlZnRTdW1zKSB7CiAgICAgICAgaW50IHJlcXVpcmVkID0gdGFyZ2V0IC0gc3VtOwogICAgICAgIGlmIChiaW5hcnlfc2VhcmNoKHJpZ2h0U3Vtcy5iZWdpbigpLCByaWdodFN1bXMuZW5kKCksIHJlcXVpcmVkKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiBmYWxzZTsKfQoKaW50IG1haW4oKSB7CiAgICB2ZWN0b3I8aW50PiBudW1zID0gezMsIDQsIDgsIDJ9OwogICAgaW50IHRhcmdldCA9IDEwOwoKICAgIGlmIChtZWV0SW5UaGVNaWRkbGVTdWJzZXRTdW0obnVtcywgdGFyZ2V0KSkgewogICAgICAgIGNvdXQgPDwgIlN1YnNldCB3aXRoIHRhcmdldCBzdW0gZXhpc3RzIiA8PCBlbmRsOwogICAgfSBlbHNlIHsKICAgICAgICBjb3V0IDw8ICJObyBzdWJzZXQgd2l0aCB0YXJnZXQgc3VtIGZvdW5kIiA8PCBlbmRsOwogICAgfQoKICAgIHJldHVybiAwOwp9