Open In App

Maximum sum by adding numbers with same number of set bits

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

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 <bits/stdc++.h>
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 <stdio.h>
#include <stdlib.h>
#include<math.h>
  
//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




<?php
// PHP program to find maximum
// sum by adding numbers with
// same number of set bits
  
// count the number of bits
// for each element of array
function bit_count($n)
{
    $count = 0;
  
    // Count the number
    // of set bits
    while ($n)
    {
        $count++;
  
        $n = $n & ($n - 1);
    }
  
    return $count;
}
  
// Function to return the
// the maximum sum
function maxsum($arr, $n)
{
    $bits = array($n);
  
    // Calculate the
    for ($i = 0; $i < $n; $i++) 
    {
        $bits[$i] = bit_count($arr[$i]);
    }
  
    // Assuming the number to be
    // a maximum of 32 bits
    $sum = array_fill(0, 32, 0);
  
    // Add the number to the
    // number of set bits
    for ($i = 0; $i < $n; $i++) 
    {
        $sum[$bits[$i]] += $arr[$i];
    }
  
    $maximum = 0;
  
    // Find the maximum sum
    for ($i = 0; $i < 32; $i++)
    {
  
        $maximum = max($sum[$i],
                       $maximum);
    }
  
    return $maximum;
}
  
// Driver code
$arr = array( 2, 3, 8, 5, 6, 7 );
$n = sizeof($arr);
echo maxsum($arr, $n);
  
// This code is contributed by mits
?>


Javascript




<script>
  
// Javascript program to find maximum sum
// by adding numbers with same number of set bits
  
// count the number of bits
// for each element of array
function bit_count(n)
{
    var count = 0;
  
    // Count the number of set bits
    while (n) {
        count++;
  
        n = n & (n - 1);
    }
  
    return count;
}
  
// Function to return the
// the maximum sum
function maxsum(arr, n)
{
    var bits = Array(n);
  
    // Calculate the
    for (var i = 0; i < n; i++) {
        bits[i] = bit_count(arr[i]);
    }
  
    // Assuming the number to be
    // a maximum of 32 bits
    var sum = Array(32).fill(0);
  
    // Add the number to the
    // number of set bits
    for (var i = 0; i < n; i++) {
        sum[bits[i]] += arr[i];
    }
  
    var maximum = 0;
  
    // Find the maximum sum
    for (var i = 0; i < 32; i++) {
  
        maximum = Math.max(sum[i], maximum);
    }
  
    return maximum;
}
  
// Driver code
var arr = [2, 3, 8, 5, 6, 7];
var n = arr.length;
document.write( maxsum(arr, n));
  
// This code is contributed by famously.
</script>


Output: 

14

 

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



Last Updated : 01 Aug, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads