mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-15 01:40:49 +08:00
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.
This commit is contained in:
64
DynamicProgramming/Minimum sum partition
Normal file
64
DynamicProgramming/Minimum sum partition
Normal file
@ -0,0 +1,64 @@
|
||||
// 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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user