# Divide 1 to n into two groups with minimum sum difference

Given a positive integer n such that n > 2. Divide numbers from 1 to n in two groups such that absolute difference of sum of each group is minimum. Print any two groups with their size in first line and in next line print elements of that group.

Examples:

```Input : 5
Output : 2
5 2
3
4 3 1
Here sum of group 1 is 7 and sum of group 2 is 8.
Their absolute difference is 1 which is minimum.
We can have multiple correct answers. (1, 2, 5) and
(3, 4) is another such group.

Input : 6
Output : 2
6 4
4
5 3 2 1
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

We can always divide sum of n integers in two groups such that their absolute difference of their sum is 0 or 1. So sum of group at most differ by 1. We define sum of group1 as half of n elements sum.

Now run a loop from n to 1 and insert i into group1 if inserting an element doesn’t exceed group1 sum otherwise insert that i into group2.

## C++

 `// CPP program to divide n integers ` `// in two groups such that absolute ` `// difference of their sum is minimum ` `#include ` `using` `namespace` `std; ` ` `  `// To print vector along size ` `void` `printVector(vector<``int``> v) ` `{ ` `    ``// Print vector size ` `    ``cout << v.size() << endl; ` ` `  `    ``// Print vector elements ` `    ``for` `(``int` `i = 0; i < v.size(); i++) ` `        ``cout << v[i] << ``" "``; ` ` `  `    ``cout << endl; ` `} ` ` `  `// To divide n in two groups such that ` `// absolute difference of their sum is  ` `// minimum ` `void` `findTwoGroup(``int` `n) ` `{ ` `    ``// Find sum of all elements upto n ` `    ``int` `sum = n * (n + 1) / 2; ` ` `  `    ``// Sum of elements of group1 ` `    ``int` `group1Sum = sum / 2; ` ` `  `    ``vector<``int``> group1, group2; ` ` `  `    ``for` `(``int` `i = n; i > 0; i--) { ` ` `  `        ``// If sum is greater then or equal ` `        ``// to 0 include i in group 1 ` `        ``// otherwise include in group2 ` `        ``if` `(group1Sum - i >= 0) { ` ` `  `            ``group1.push_back(i); ` ` `  `            ``// Decrease sum of group1 ` `            ``group1Sum -= i; ` `        ``} ` `        ``else` `{ ` `            ``group2.push_back(i); ` `        ``} ` `    ``} ` ` `  `    ``// Print both the groups ` `    ``printVector(group1); ` `    ``printVector(group2); ` `} ` ` `  `// Driver program to test above functions ` `int` `main() ` `{ ` `    ``int` `n = 5; ` `    ``findTwoGroup(n); ` `    ``return` `0; ` `} `

## Java

 `// Java program to divide n integers ` `// in two groups such that absolute ` `// difference of their sum is minimum ` `import` `java.io.*; ` `import` `java.util.*; ` ` `  `class` `GFG  ` `{ ` `    ``// To print vector along size ` `    ``static` `void` `printVector(Vector v) ` `    ``{ ` `        ``// Print vector size ` `        ``System.out.println(v.size()); ` `     `  `        ``// Print vector elements ` `        ``for` `(``int` `i = ``0``; i < v.size(); i++) ` `            ``System.out.print(v.get(i) + ``" "``); ` `     `  `        ``System.out.println(); ` `    ``} ` `     `  `    ``// To divide n in two groups such that ` `    ``// absolute difference of their sum is  ` `    ``// minimum ` `    ``static` `void` `findTwoGroup(``int` `n) ` `    ``{ ` `        ``// Find sum of all elements upto n ` `        ``int` `sum = n * (n + ``1``) / ``2``; ` `     `  `        ``// Sum of elements of group1 ` `        ``int` `group1Sum = sum / ``2``; ` `     `  `        ``Vector group1 = ``new` `Vector(); ` `        ``Vector group2 = ``new` `Vector(); ` `     `  `        ``for` `(``int` `i = n; i > ``0``; i--) { ` `     `  `            ``// If sum is greater then or equal ` `            ``// to 0 include i in group1 ` `            ``// otherwise include in group2 ` `            ``if` `(group1Sum - i >= ``0``) { ` `     `  `                ``group1.add(i); ` `     `  `                ``// Decrease sum of group1 ` `                ``group1Sum -= i; ` `            ``} ` `            ``else` `{ ` `                ``group2.add(i); ` `            ``} ` `        ``} ` `     `  `        ``// Print both the groups ` `        ``printVector(group1); ` `        ``printVector(group2); ` `    ``} ` `     `  `    ``// Driver code ` `    ``public` `static` `void` `main (String[] args)  ` `    ``{ ` `        ``int` `n = ``5``; ` `        ``findTwoGroup(n); ` `    ``} ` `} ` ` `  `// This code is contributed by Gitanjali. `

## Python3

 `# Python program to divide n integers ` `# in two groups such that absolute ` `# difference of their sum is minimum ` `import` `math ` ` `  `# To print vector along size ` `def` `printVector( v): ` ` `  `    ``# Print vector size ` `    ``print``(``len``(v)) ` ` `  `    ``# Print vector elements ` `    ``for` `i ``in` `range``( ``0``, ``len``(v)): ` `        ``print``(v[i] , end ``=`  `" "``) ` ` `  `    ``print``() ` ` `  ` `  `# To divide n in two groups such that ` `# absolute difference of their sum is  ` `# minimum ` `def` `findTwoGroup(n): ` ` `  `    ``# Find sum of all elements upto n ` `    ``sum` `=` `n ``*` `(n ``+` `1``) ``/` `2` ` `  `    ``# Sum of elements of group1 ` `    ``group1Sum ``=` `sum` `/` `2` ` `  `    ``group1``=``[] ` `    ``group2``=``[] ` `    ``for` `i ``in` `range``(n, ``0``, ``-``1``): ` ` `  `        ``# If sum is greater then or equal ` `        ``# to 0 include i in group 1 ` `        ``# otherwise include in group2 ` `        ``if` `(group1Sum ``-` `i >``=` `0``) : ` `            ``group1.append(i) ` ` `  `            ``# Decrease sum of group1 ` `            ``group1Sum ``-``=` `i ` `         `  `        ``else` `: ` `            ``group2.append(i) ` ` `  `    ``# Print both the groups ` `    ``printVector(group1) ` `    ``printVector(group2) ` ` `  `# driver code ` `n ``=` `5` `findTwoGroup(n) ` ` `  `# This code is contributed by Gitanjali. `

## C#

 `// C# program to divide n integers ` `// in two groups such that absolute ` `// difference of their sum is minimum ` `using` `System; ` `using` `System.Collections; ` ` `  `class` `GFG  ` `{ ` `// To print vector along size ` `static` `void` `printVector(ArrayList v) ` `{ ` `    ``// Print vector size ` `    ``Console.WriteLine(v.Count); ` ` `  `    ``// Print vector elements ` `    ``for` `(``int` `i = 0; i < v.Count; i++) ` `        ``Console.Write(v[i] + ``" "``); ` ` `  `    ``Console.WriteLine(); ` `} ` ` `  `// To divide n in two groups  ` `// such that absolute difference  ` `// of their sum is minimum ` `static` `void` `findTwoGroup(``int` `n) ` `{ ` `    ``// Find sum of all elements upto n ` `    ``int` `sum = n * (n + 1) / 2; ` ` `  `    ``// Sum of elements of group1 ` `    ``int` `group1Sum = sum / 2; ` `     `  `    ``ArrayList group1 = ``new` `ArrayList(); ` `    ``ArrayList group2 = ``new` `ArrayList(); ` ` `  `    ``for` `(``int` `i = n; i > 0; i--)  ` `    ``{ ` ` `  `        ``// If sum is greater then  ` `        ``// or equal to 0 include i  ` `        ``// in group1 otherwise  ` `        ``// include in group2 ` `        ``if` `(group1Sum - i >= 0)  ` `        ``{ ` `            ``group1.Add(i); ` ` `  `            ``// Decrease sum of group1 ` `            ``group1Sum -= i; ` `        ``} ` `        ``else`  `        ``{ ` `            ``group2.Add(i); ` `        ``} ` `    ``} ` ` `  `    ``// Print both the groups ` `    ``printVector(group1); ` `    ``printVector(group2); ` `} ` ` `  `// Driver code ` `public` `static` `void` `Main()  ` `{ ` `    ``int` `n = 5; ` `    ``findTwoGroup(n); ` `} ` `} ` ` `  `// This code is contributed by mits `

## PHP

 ` 0; ``\$i``--)  ` `    ``{ ` ` `  `        ``// If sum is greater then  ` `        ``// or equal to 0 include  ` `        ``// i in group 1 otherwise  ` `        ``// include in group2 ` `        ``if` `(``\$group1Sum` `- ``\$i` `>= 0)  ` `        ``{ ` ` `  `            ``\$group1``[``\$x``++] = ``\$i``; ` ` `  `            ``// Decrease sum ` `            ``// of group1 ` `            ``\$group1Sum` `-= ``\$i``; ` `        ``} ` `        ``else`  `        ``{ ` `            ``\$group2``[``\$y``++] = ``\$i``; ` `        ``} ` `    ``} ` ` `  `    ``// Print both the groups ` `    ``printVector(``\$group1``); ` `    ``printVector(``\$group2``); ` `} ` ` `  `// Driver Code ` `\$n` `= 5; ` `findTwoGroup(``\$n``); ` ` `  `// This code is contributed by mits.  ` `?> `

Output:

```2
5 2
3
4 3 1
```

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Improved By : Mithun Kumar