C语言中两个m元素子集的最大差值


任务是找到数组中m个元素之和的最大差值。假设我们有一个数组和一个数字m,那么我们将首先找到m个最大数字之和,然后从中减去m个最小数字之和,以获得最大差值。因此,主要任务是找到两个m个数字的子集,它们具有最大和和最小和。

让我们现在用一个例子来理解我们必须做什么:

输入

arr = {1,2,3,4,5} ; m=3

输出

Maximum difference here is : 6

解释:这里最大的3个数字是3,4,5,它们的和是12。最小的3个数字是1,2,3,它们的和是6。因此,最大差值是12-6,即6。

输入

arr = {10,13,22,8,16,14}; m=4

输出

Maximum difference here is : 20

解释:这里最大的4个数字是22,16,14,13,它们的和是65。最小的4个数字是8,10,13,14,它们的和是45。因此,最大差值是65-45,即20。

下面程序中使用的算法如下:

  • 获取输入数组arr[]和一个用于创建集合的数字m。

  • 在find_diff()函数中,我们传递输入数组及其长度,并返回m个元素集合之和的最大差值。

  • 在这里,我们将首先对数组arr[]的元素进行排序。

  • 然后我们将找到前m个和后m个元素的和,因为这些将是arr[]中最小的m个和最大的m个数。

  • 最后我们返回差值。

  • 注意:假设sort(arr[],int)返回已排序的数组。

示例

#include<stdio.h>
//create function to calculate maximum difference between sum of highest and lowest m elements of array
int find_diff(int arr[],int length,int m){
   //for sorting the array
   sort(arr,length);
   int maxsum=0, minsum=0;
   //calculate now max difference between two subsets of m elements
   for(int i=0;i<m;i++){
      minsum+=arr[i];
      maxsum+=arr[length-i-1];
   }
   return(maxsum-minsum);
}
// Driver program
int main(){
   int arr[]={1,1,2,3,5,7,1};
   int m=3;
   cout << find_diff(arr,7,m);
   return 0;
}

输出

如果我们运行上面的代码,我们将得到以下输出:

12

更新于:2020年8月14日

688 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告