GeeksforGeeks App
Open App
Browser
Continue

Maximum sum by adding numbers with same number of set bits

Given an array of N numbers, the task is to find the maximum sum that can be obtained by adding numbers with the same number of set bits.
Examples:

Input: 32 3 7 5 27 28
Output: 34
Input: 2 3 8 5 6 7
Output: 14

Approach

• Traverse in the array and count the number of set bits for every element.
• Initialize an array for 32 bits, assuming the number to have a maximum of 32 set bits.
• Iterate in the array and add the array element to the position which indicates the number of set bits.
• Traverse and find the maximum sum and return it.

Below is the implementation of the above approach:

C++

 `// C++ program to find maximum sum``// by adding numbers with same number of set bits``#include ``using` `namespace` `std;`` ` `// count the number of bits``// for each element of array``int` `bit_count(``int` `n)``{``    ``int` `count = 0;`` ` `    ``// Count the number of set bits``    ``while` `(n) {``        ``count++;`` ` `        ``n = n & (n - 1);``    ``}`` ` `    ``return` `count;``}`` ` `// Function to return the``// the maximum sum``int` `maxsum(``int` `arr[], ``int` `n)``{``    ``int` `bits[n];`` ` `    ``// Calculate the``    ``for` `(``int` `i = 0; i < n; i++) {``        ``bits[i] = bit_count(arr[i]);``    ``}`` ` `    ``// Assuming the number to be``    ``// a maximum of 32 bits``    ``int` `sum[32] = { 0 };`` ` `    ``// Add the number to the``    ``// number of set bits``    ``for` `(``int` `i = 0; i < n; i++) {``        ``sum[bits[i]] += arr[i];``    ``}`` ` `    ``int` `maximum = 0;`` ` `    ``// Find the maximum sum``    ``for` `(``int` `i = 0; i < 32; i++) {`` ` `        ``maximum = max(sum[i], maximum);``    ``}`` ` `    ``return` `maximum;``}`` ` `// Driver code``int` `main()``{`` ` `    ``int` `arr[] = { 2, 3, 8, 5, 6, 7 };``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr[0]);``    ``cout << maxsum(arr, n);`` ` `    ``return` `0;``}`

C

 `// C program to find maximum sum``// by adding numbers with same number of set bits``#include ``#include ``#include`` ` `//function to find the maximum of two numbers`` ` `int` `max(``int` `a,``int` `b)``{``if``(a>b)``    ``return` `a;``else``    ``return` `b;``}`` ` `// count the number of bits``// for each element of array`` ` `int` `bit_count(``int` `n)``{``    ``int` `count = 0;`` ` `    ``// Count the number of set bits``    ``while` `(n) {``        ``count++;`` ` `        ``n = n & (n - 1);``    ``}`` ` `    ``return` `count;``}`` ` `// Function to return the``// the maximum sum``int` `maxsum(``int` `arr[], ``int` `n)``{``    ``int` `bits[n];`` ` `    ``// Calculate the``    ``for` `(``int` `i = 0; i < n; i++) {``        ``bits[i] = bit_count(arr[i]);``    ``}`` ` `    ``// Assuming the number to be``    ``// a maximum of 32 bits``    ``int` `sum[32] = { 0 };`` ` `    ``// Add the number to the``    ``// number of set bits``    ``for` `(``int` `i = 0; i < n; i++) {``        ``sum[bits[i]] += arr[i];``    ``}`` ` `    ``int` `maximum = 0;`` ` `    ``// Find the maximum sum``    ``for` `(``int` `i = 0; i < 32; i++) {`` ` `        ``maximum = max(sum[i], maximum);``    ``}`` ` `    ``return` `maximum;``}`` ` `// Driver code``int` `main()``{`` ` `    ``int` `arr[] = { 2, 3, 8, 5, 6, 7 };``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr[0]);``    ``int` `ans=maxsum(arr,n);``    ``printf``(``"%d"``,ans);``    ``return` `0;``}`

Java

 `// Java program to find maximum sum``// by adding numbers with same number of set bits`` ` `class` `GFG``{``// count the number of bits``// for each element of array``static` `int` `bit_count(``int` `n)``{``    ``int` `count = ``0``;`` ` `    ``// Count the number of set bits``    ``while` `(n>``0``)``    ``{``        ``count++;`` ` `        ``n = n & (n - ``1``);``    ``}`` ` `    ``return` `count;``}`` ` `// Function to return the``// the maximum sum``static` `int` `maxsum(``int``[] arr, ``int` `n)``{``    ``int``[] bits=``new` `int``[n];`` ` `    ``// Calculate the``    ``for` `(``int` `i = ``0``; i < n; i++) ``    ``{``        ``bits[i] = bit_count(arr[i]);``    ``}`` ` `    ``// Assuming the number to be``    ``// a maximum of 32 bits``    ``int``[] sum=``new` `int``[``32``];`` ` `    ``// Add the number to the``    ``// number of set bits``    ``for` `(``int` `i = ``0``; i < n; i++)``    ``{``        ``sum[bits[i]] += arr[i];``    ``}`` ` `    ``int` `maximum = ``0``;`` ` `    ``// Find the maximum sum``    ``for` `(``int` `i = ``0``; i < ``32``; i++)``    ``{`` ` `        ``maximum = Math.max(sum[i], maximum);``    ``}`` ` `    ``return` `maximum;``}`` ` `// Driver code``public` `static` `void` `main (String[] args)``{``    ``int``[] arr = { ``2` `,``3` `, ``8``, ``5``, ``6``, ``7` `};``    ``int` `n = arr.length;``    ``System.out.println(maxsum(arr, n));`` ` `}``}`` ` `// This Code is contributed by mits`

Python3

 `# Python3 program to find maximum``# sum by adding numbers with``# same number of set bits`` ` `# count the number of bits``# for each element of array``def` `bit_count(n):``    ``count ``=` `0``;`` ` `    ``# Count the number``    ``# of set bits``    ``while` `(n > ``0``):``        ``count ``+``=` `1``;`` ` `        ``n ``=` `n & (n ``-` `1``);`` ` `    ``return` `count;`` ` `# Function to return the``# the maximum sum``def` `maxsum(arr, n):``    ``bits ``=` `[``0``] ``*` `n;`` ` `    ``# Calculate the``    ``for` `i ``in` `range``(n): ``        ``bits[i] ``=` `bit_count(arr[i]);`` ` `    ``# Assuming the number to be``    ``# a maximum of 32 bits``    ``sum` `=` `[``0``] ``*` `32``;`` ` `    ``# Add the number to the``    ``# number of set bits``    ``for` `i ``in` `range``(n): ``        ``sum``[bits[i]] ``+``=` `arr[i];`` ` `    ``maximum ``=` `0``;`` ` `    ``# Find the maximum sum``    ``for` `i ``in` `range``(``32``):`` ` `        ``maximum ``=` `max``(``sum``[i], maximum);`` ` `    ``return` `maximum;`` ` `# Driver code``arr ``=` `[ ``2``, ``3``, ``8``, ``5``, ``6``, ``7` `];``n ``=` `len``(arr);``print``(maxsum(arr, n));`` ` `# This code is contributed by mits`

C#

 `// C# program to find maximum ``// sum by adding numbers with ``// same number of set bits``using` `System;`` ` `class` `GFG``{``// count the number of bits``// for each element of array``static` `int` `bit_count(``int` `n)``{``    ``int` `count = 0;`` ` `    ``// Count the number``    ``// of set bits``    ``while` `(n > 0)``    ``{``        ``count++;`` ` `        ``n = n & (n - 1);``    ``}`` ` `    ``return` `count;``}`` ` `// Function to return the``// the maximum sum``static` `int` `maxsum(``int``[] arr, ``int` `n)``{``    ``int``[] bits = ``new` `int``[n];`` ` `    ``// Calculate the``    ``for` `(``int` `i = 0; i < n; i++) ``    ``{``        ``bits[i] = bit_count(arr[i]);``    ``}`` ` `    ``// Assuming the number to be``    ``// a maximum of 32 bits``    ``int``[] sum = ``new` `int``[32];`` ` `    ``// Add the number to the``    ``// number of set bits``    ``for` `(``int` `i = 0; i < n; i++)``    ``{``        ``sum[bits[i]] += arr[i];``    ``}`` ` `    ``int` `maximum = 0;`` ` `    ``// Find the maximum sum``    ``for` `(``int` `i = 0; i < 32; i++)``    ``{``        ``maximum = Math.Max(sum[i], maximum);``    ``}`` ` `    ``return` `maximum;``}`` ` `// Driver code``static` `void` `Main()``{``    ``int``[] arr = { 2 ,3 , 8, 5, 6, 7 };``    ``int` `n = arr.Length;``    ``Console.WriteLine(maxsum(arr, n));``}``}`` ` `// This Code is contributed by mits`

PHP

 ``

Javascript

 ``

Output:

`14`

Time Complexity: O(N * 32)
Auxiliary Space: O(N)

My Personal Notes arrow_drop_up