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)