Skip to content

Commit b1caf8c

Browse files
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.
1 parent e3a78a6 commit b1caf8c

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// Partition a set into two subsets such that the difference of subset sums is minimum
2+
3+
import java.util.*;
4+
import java.lang.*;
5+
import java.io.*;
6+
class GFG
7+
{
8+
public static void main (String[] args)
9+
{
10+
Scanner sc=new Scanner(System.in);
11+
int t=sc.nextInt();
12+
while(t-->0)
13+
{
14+
int n=sc.nextInt();
15+
int arr[]=new int[n];
16+
int sum=0;
17+
for(int i=0;i<n;i++)
18+
{
19+
arr[i]=sc.nextInt();
20+
sum+=arr[i];
21+
}
22+
int ans[]=new int[sum];
23+
ans=subset(arr,sum);
24+
int min=Integer.MAX_VALUE;
25+
for(int i=0;i<ans.length;i++)
26+
min=Math.min(min,(sum-2*ans[i]));
27+
28+
System.out.println(min);
29+
30+
31+
}
32+
}
33+
static int[] subset(int arr[],int sum)
34+
{
35+
int n=arr.length;
36+
boolean dp[][]=new boolean[n+1][sum+1];
37+
for(int i=0;i<=n;i++)
38+
dp[i][0]=true;
39+
for(int i=1;i<=sum;i++)
40+
dp[0][i]=false;
41+
42+
// subset sum concept
43+
for(int i=1;i<=n;i++)
44+
{
45+
for(int j=1;j<=sum;j++)
46+
{
47+
if(arr[i-1]<=j)
48+
dp[i][j]=dp[i-1][j-arr[i-1]] || dp[i-1][j];
49+
else
50+
dp[i][j]=dp[i-1][j];
51+
}
52+
}
53+
54+
//storing last dp column whose value is true till sum/2
55+
int index[]=new int[sum];
56+
int p=0;
57+
for(int i=0;i<=sum/2;i++)
58+
{
59+
if(dp[n][i]==true)
60+
index[p++]=i;
61+
}
62+
return index;
63+
}
64+
}

0 commit comments

Comments
 (0)