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 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.