Files
Java/DynamicProgramming/Minimum sum partition
Swati Prajapati b1caf8c6ae Minimum sum partition
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.
2020-06-01 23:41:32 +05:30

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;
}
}