mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-14 17:32:35 +08:00

Given an array, the task is to divide it into two sets S1 and S2 such that the absolute difference between their sums is minimum.
65 lines
1.4 KiB
Plaintext
65 lines
1.4 KiB
Plaintext
// Partition a set into two subsets such that the difference of subset sums is minimum
|
|
|
|
import java.util.*;
|
|
import java.lang.*;
|
|
import java.io.*;
|
|
class GFG
|
|
{
|
|
public static void main (String[] args)
|
|
{
|
|
Scanner sc=new Scanner(System.in);
|
|
int t=sc.nextInt();
|
|
while(t-->0)
|
|
{
|
|
int n=sc.nextInt();
|
|
int arr[]=new int[n];
|
|
int sum=0;
|
|
for(int i=0;i<n;i++)
|
|
{
|
|
arr[i]=sc.nextInt();
|
|
sum+=arr[i];
|
|
}
|
|
int ans[]=new int[sum];
|
|
ans=subset(arr,sum);
|
|
int min=Integer.MAX_VALUE;
|
|
for(int i=0;i<ans.length;i++)
|
|
min=Math.min(min,(sum-2*ans[i]));
|
|
|
|
System.out.println(min);
|
|
|
|
|
|
}
|
|
}
|
|
static int[] subset(int arr[],int sum)
|
|
{
|
|
int n=arr.length;
|
|
boolean dp[][]=new boolean[n+1][sum+1];
|
|
for(int i=0;i<=n;i++)
|
|
dp[i][0]=true;
|
|
for(int i=1;i<=sum;i++)
|
|
dp[0][i]=false;
|
|
|
|
// subset sum concept
|
|
for(int i=1;i<=n;i++)
|
|
{
|
|
for(int j=1;j<=sum;j++)
|
|
{
|
|
if(arr[i-1]<=j)
|
|
dp[i][j]=dp[i-1][j-arr[i-1]] || dp[i-1][j];
|
|
else
|
|
dp[i][j]=dp[i-1][j];
|
|
}
|
|
}
|
|
|
|
//storing last dp column whose value is true till sum/2
|
|
int index[]=new int[sum];
|
|
int p=0;
|
|
for(int i=0;i<=sum/2;i++)
|
|
{
|
|
if(dp[n][i]==true)
|
|
index[p++]=i;
|
|
}
|
|
return index;
|
|
}
|
|
}
|