Perhaps you are talking about this.
https://practice.geeksforgeeks.org/problems/partition-a-set-into-two-subsets-such-that-the-difference-of-subset-sums-is-minimum-set-2/1?page=3&difficulty[]=2&status[]=unsolved&status[]=attempted&sortBy=difficulty
I did it using MEET IN THE MIDDLE APPROACH. Its an optimization technique which works by splitting the array in two parts and then generating the subsets.
Code , feel free to ask if any queries
class Solution{
public:
void generate(vector<int> &arr, int curr, int n, int sum, vector<vector<pair<int,vector<int>>>> &store, vector<int> build){
if(curr==n){
int sz=build.size();
store[sz].push_back({sum,build});
return;
}
build.push_back(curr);
generate(arr,curr+1,n,sum+arr[curr],store,build);
build.pop_back();
generate(arr,curr+1,n,sum,store,build);
}
static bool cmp(pair<int,vector<int>> &p1, pair<int,vector<int>> &p2){
return p1.first<p2.first;
}
int BINRY_SRCH(vector<pair<int,vector<int>>> &arr, int target){
int res=-1;
int low=0;
int high=arr.size()-1;
while(low<=high){
int mid=(low+high)/2;
if(arr[mid].first>=target){
res=mid;
high=mid-1;
}
else{
low=mid+1;
}
}
return res;
}
vector<vector<int>> minDifference(vector<int>& arr, int n){
int extra=(n%2!=0);
vector<vector<pair<int,vector<int>>>> part1(n/2+1+extra);
vector<vector<pair<int,vector<int>>>> part2(n/2+1);
generate(arr,0,n/2+extra,0,part1,{});
generate(arr,n/2+extra,n,0,part2,{});
for(auto &c: part2){
sort(c.begin(),c.end(),cmp);
}
vector<vector<int>> res(2);
int diff=INT_MAX;
int sum=accumulate(arr.begin(),arr.end(),0);
for(int ele=1;ele<=n/2+extra;ele++){ // making a single subset
vector<pair<int,vector<int>>> P1=part1[ele];
vector<pair<int,vector<int>>> P2=part2[n/2+extra-ele];
for(auto x: P1){
int index=BINRY_SRCH(P2,sum/2-x.first);
if(index!=-1){
int subset1_Sum=x.first+P2[index].first;
int subset2_Sum=sum-subset1_Sum;
if(abs(subset1_Sum-subset2_Sum)<diff){
diff=abs(subset1_Sum-subset2_Sum);
vector<int> subset1=x.second;
for(auto c: P2[index].second){
subset1.push_back(c);
}
res[0]=subset1;
}
}
if(index>0){
index--;
int subset1_Sum=x.first+P2[index].first;
int subset2_Sum=sum-subset1_Sum;
if(abs(subset1_Sum-subset2_Sum)<diff){
diff=abs(subset1_Sum-subset2_Sum);
vector<int> subset1=x.second;
for(auto c: P2[index].second){
subset1.push_back(c);
}
res[0]=subset1;
}
}
}
}
vector<bool> vis(n,false);
for(int i=0;i<res[0].size();i++){
vis[res[0][i]]=true;
res[0][i]=arr[res[0][i]];
}
vector<int> subset2;
for(int i=0;i<n;i++){
if(vis[i]==false){
subset2.push_back(arr[i]);
}
}
res[1]=subset2;
// for(auto c: res[0]){
// cout<<c<<" ";
// }
// cout<<endl;
// for(auto c: res[1]){
// cout<<c<<" ";
// }
// cout<<endl;
return res;
}
};
CODE BY RAINX, ABHIJIT ROY, NIT AGARTALA