# Maximum even sum subsequence

Given a array of n positive and negative integers, find the subsequence with the maximum even sum and display that even sum.

Examples:

```Input: arr[] = {-2, 2, -3, 1, 3}
Output: 6
Explanation: The longest subsequence
with even sum is 2, 1 and 3.

Input: arr[] = {-2, 2, -3, 4, 5}
Output: 6
Explanation: The longest subsequence
with even sum is 2, 1 and 3.
```

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

The approach to the problem can be shorted down to points:

1) Sum up all positive numbers
2) If the sum is even then that will be the max sum possible
3) If the sum is not even then either subtract a positive odd number from it, or add a negative odd.
—Find maximum max odd of negative odd numbers, hence sum+a[I] (as a[I] is itself negative)
—Find minimum min odd of positive odd numbers, hence sun-a[I].
—The maximum of the both the results will be the answer.

Below is the implementation of the above approach

## C++

 `// CPP program to find longest even sum ` `// subsequence. ` `#include ` `using` `namespace` `std; ` ` `  `// Returns sum of maximum even sum subsequence ` `int` `maxEvenSum(``int` `arr[], ``int` `n) ` `{ ` `    ``// Find sum of positive numbers ` `    ``int` `pos_sum = 0; ` `    ``for` `(``int` `i = 0; i < n; ++i) ` `        ``if` `(arr[i] > 0) ` `            ``pos_sum += arr[i]; ` ` `  `    ``// If sum is even, it is our ` `    ``// answer ` `    ``if` `(pos_sum % 2 == 0) ` `        ``return` `pos_sum; ` ` `  `    ``// Traverse the array to find the ` `    ``// maximum sum by adding a positive ` `    ``// odd or subtracting a negative odd ` `    ``int` `ans = INT_MIN; ` `    ``for` `(``int` `i = 0; i < n; ++i) { ` `        ``if` `(arr[i] % 2 != 0) { ` `            ``if` `(arr[i] > 0) ` `                ``ans = max(ans, pos_sum - arr[i]); ` `            ``else` `                ``ans = max(ans, pos_sum + arr[i]); ` `        ``} ` `    ``} ` ` `  `    ``return` `ans; ` `} ` ` `  `// driver program ` `int` `main() ` `{ ` `    ``int` `a[] = { -2, 2, -3, 1 }; ` `    ``int` `n = ``sizeof``(a) / ``sizeof``(a); ` `    ``cout << maxEvenSum(a, n); ` `    ``return` `0; ` `} `

## Java

 `// Java program to find longest  ` `// even sum subsequence. ` `class` `MaxevenSum  ` `{ ` `     `  `    ``// Returns sum of maximum even sum ` `    ``// subsequence ` `    ``static` `int` `maxEvenSum(``int` `arr[], ``int` `n) ` `    ``{ ` `        ``// Find sum of positive numbers ` `        ``int` `pos_sum = ``0``; ` `        ``for` `(``int` `i = ``0``; i < n; ++i) ` `            ``if` `(arr[i] > ``0``) ` `                ``pos_sum += arr[i]; ` ` `  `        ``// If sum is even, it is our ` `        ``// answer ` `        ``if` `(pos_sum % ``2` `== ``0``) ` `            ``return` `pos_sum; ` ` `  `        ``// Traverse the array to find the ` `        ``// maximum sum by adding a  ` `        ``// positive odd or subtracting a ` `        ``// negative odd ` `        ``int` `ans = Integer.MIN_VALUE; ` `        ``for` `(``int` `i = ``0``; i < n; ++i) { ` `            ``if` `(arr[i] % ``2` `!= ``0``) { ` `                ``if` `(arr[i] > ``0``) ` `                    ``ans = ans>(pos_sum - arr[i]) ?  ` `                          ``ans:(pos_sum - arr[i]); ` `                ``else` `                    ``ans = ans>(pos_sum + arr[i]) ?  ` `                          ``ans:(pos_sum + arr[i]); ` `            ``} ` `        ``}    ` ` `  `        ``return` `ans;  ` `    ``} ` ` `  `    ``// driver program    ` `    ``public` `static` `void` `main(String s[]) ` `    ``{ ` `        ``int` `a[] = {-``2``, ``2``, -``3``, ``1``}; ` `         `  `        ``System.out.println(maxEvenSum(a, a.length));     ` ` `  `    ``} ` `} ` `// This code is contributed by Prerna Saini `

## Python3

 `# Python 3 program to find longest ` `# even sum subsequence.  ` `INT_MIN ``=` `-``100000000` ` `  `# Returns sum of maximum even ` `# sum subsequence  ` `def` `maxEvenSum(arr, n): ` `     `  `    ``# Find sum of positive numbers  ` `    ``pos_sum ``=` `0` `    ``for` `i ``in` `range``(n):  ` `        ``if` `(arr[i] > ``0``):  ` `            ``pos_sum ``+``=` `arr[i]  ` ` `  `    ``# If sum is even, it is our answer  ` `    ``if` `(pos_sum ``%` `2` `=``=` `0``):  ` `        ``return` `pos_sum  ` ` `  `    ``# Traverse the array to find the  ` `    ``# maximum sum by adding a positive  ` `    ``# odd or subtracting a negative odd  ` `    ``ans ``=` `INT_MIN;  ` `    ``for` `i ``in` `range``(n): ` `        ``if` `(arr[i] ``%` `2` `!``=` `0``): ` `            ``if` `(arr[i] > ``0``):  ` `                ``ans ``=` `max``(ans, pos_sum ``-` `arr[i]) ` `            ``else``: ` `                ``ans ``=` `max``(ans, pos_sum ``+` `arr[i]) ` `    ``return` `ans ` ` `  `# Driver Code ` `a ``=` `[``-``2``, ``2``, ``-``3``, ``1``]  ` `n ``=` `len``(a)  ` `print``(maxEvenSum(a, n)) ` ` `  `# This code is contributed by sahilshelangia  `

## C#

 `// C# program to find longest  ` `// even sum subsequence. ` `using` `System; ` ` `  `class` `GFG { ` `     `  `    ``// Returns sum of maximum even sum ` `    ``// subsequence ` `    ``static` `int` `maxEvenSum(``int` `[]arr, ``int` `n) ` `    ``{ ` `         `  `        ``// Find sum of positive numbers ` `        ``int` `pos_sum = 0; ` `        ``for` `(``int` `i = 0; i < n; ++i) ` `            ``if` `(arr[i] > 0) ` `                ``pos_sum += arr[i]; ` ` `  `        ``// If sum is even, it is our ` `        ``// answer ` `        ``if` `(pos_sum % 2 == 0) ` `            ``return` `pos_sum; ` ` `  `        ``// Traverse the array to find the ` `        ``// maximum sum by adding a  ` `        ``// positive odd or subtracting a ` `        ``// negative odd ` `        ``int` `ans = ``int``.MinValue; ` `         `  `        ``for` `(``int` `i = 0; i < n; ++i) ` `        ``{ ` `            ``if` `(arr[i] % 2 != 0) ` `            ``{ ` `                ``if` `(arr[i] > 0) ` `                    ``ans = (ans > (pos_sum - arr[i])) ` `                         ``? ans : (pos_sum - arr[i]); ` `                ``else` `                    ``ans = (ans > (pos_sum + arr[i])) ` `                         ``? ans : (pos_sum + arr[i]); ` `            ``} ` `        ``}  ` ` `  `        ``return` `ans;  ` `    ``} ` ` `  `    ``// driver program  ` `    ``public` `static` `void` `Main() ` `    ``{ ` `        ``int` `[]a = {-2, 2, -3, 1}; ` `         `  `        ``Console.WriteLine(maxEvenSum(a, a.Length));  ` ` `  `    ``} ` `} ` ` `  `// This code is contributed by vt_m. `

## PHP

 ` 0) ` `            ``\$pos_sum` `+= ``\$arr``[``\$i``]; ` ` `  `    ``// If sum is even, it is our ` `    ``// answer ` `    ``if` `(``\$pos_sum` `% 2 == 0) ` `        ``return` `\$pos_sum``; ` ` `  `    ``// Traverse the array to find ` `    ``// the maximum sum by adding ` `    ``// a positive odd or  ` `    ``// subtracting a negative odd ` `    ``\$ans` `= PHP_INT_MIN; ` `    ``for` `( ``\$i` `= 0; ``\$i` `< ``\$n``; ++``\$i``) { ` `        ``if` `(``\$arr``[``\$i``] % 2 != 0) { ` `            ``if` `(``\$arr``[``\$i``] > 0) ` `                ``\$ans` `= max(``\$ans``,  ` `                 ``\$pos_sum` `- ``\$arr``[``\$i``]); ` `            ``else` `                ``\$ans` `= max(``\$ans``, ` `                 ``\$pos_sum` `+ ``\$arr``[``\$i``]); ` `        ``} ` `    ``} ` ` `  `    ``return` `\$ans``; ` `} ` ` `  `// driver program ` `    ``\$a` `= ``array``( -2, 2, -3, 1 ); ` `    ``\$n` `= ``count``(``\$a``); ` `    ``echo` `maxEvenSum(``\$a``, ``\$n``); ` ` `  `// This code is contributed by anuj_67. ` `?> `

Output:

`2`

Time complexity : O(n)
Auxiliary Space : O(1)

This article is contributed by Raj. 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.

My Personal Notes arrow_drop_up

Improved By : vt_m, sahilshelangia

Article Tags :
Practice Tags :

1

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.