通过在C ++中将具有相同设置位数的数字相加得到的最大和

问题陈述

给定一个由N个数字组成的数组,任务是找到可以通过将具有相同设置位数的数字相加而获得的最大和。

示例

如果输入数组为{2,5,8,9,10,7},则输出为14-

  • 2中的设置位数为1

  • 5中的设置位数为2

  • 8中的设置位数为1

  • 9中的设置位数为2

  • 10中的设置位数为2

  • 7中的设置位数为3

那么(5 + 9 + 10)的总和是24,其设置位数= 2

算法

  • 遍历数组并计算每个元素的设置位数。

  • 初始化一个32位数组,假设该数字最多具有32个设置位。

  • 在数组中进行迭代,并将数组元素添加到指示设置位数的位置。

  • 遍历并找到最大和然后返回。

示例

#include <bits/stdc++.h>
using namespace std;
int bitCount(int n){
   int count = 0;
   while (n) {
      count++;
      n = n & (n - 1);
   }
   return count;
}
int maxSum(int arr[], int n){
   int bits[n];
   for (int i = 0; i < n; i++) {
      bits[i] = bitCount(arr[i]);
   }
   int sum[32] = { 0 };
   for (int i = 0; i < n; i++) {
      sum[bits[i]] += arr[i];
   }
   int maximum = 0;
   for (int i = 0; i < 32; i++) {
      maximum = max(sum[i], maximum);
   }
   return maximum;
}
int main(){
   int arr[] = {2, 5, 8, 9, 10, 7};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << "Maximum sum = " << maxSum(arr, n) << endl;
   return 0;
}

输出结果

当您编译并执行上述程序时。它产生以下输出-

Maximum sum = 24