C語言中最大化兩個子集之間的差值


給定一個包含正整數和負整數的陣列。任務是找到陣列中存在的元素的正子集和負子集之間的最大差值。由於我們有正數和負數的子集,因此差值(正數之和) - (負數之和)將始終最大。這是因為減去負數會將它們加起來。將所有負數轉換為正數並新增陣列的所有元素將產生所需的結果。讓我們看一些示例以瞭解 -

輸入 - Arr[] = { -2, 0, -3, 8, 10, 12, -4 }

輸出 - 兩個子集之間最大化的差值 - 39

說明 - 正整數子集 {0, 8,10,12} 和為 30

負整數子集 { -2, -3, -4 } 和為 -9

最大差值將為 30 - (-9) = 39

輸入 - Arr[] = { -5, -15, -3, -2, 10, 20, 15 }

輸出 - 兩個子集之間最大化的差值 - 70

說明 - 正整數子集 { 10, 20, 15 } 和為 45

負整數子集 { -5, -15, -3, -2 } 和為 -25

最大差值將為 45 - (-25) = 70

下面程式中使用的方案如下

  • 我們取一個包含正整數和負整數的整數陣列作為 Arr[]

  • 函式 subsetDifference( int arr[],int n) 用於查詢負整數和正整數的兩個子集之間的最大化差值。它接受兩個引數,一個是陣列本身,另一個是其大小 n。

  • 取一個變數 sum=0 來儲存陣列所有元素的總和。

  • 從左開始,使用 for 迴圈 ( i=0;i<n;i++ ) 遍歷陣列的每個元素

  • 如果當前元素為負數 (<0),則將其乘以 -1 變成正數。( arr[i]=arr[i]*-1 )

  • 將每個元素新增到總和中。

  • 返回 sum 作為可能的最大子集差值。

示例

現場演示

#include <stdio.h>
int subsetDifference(int arr[], int n){
   int sum = 0;
   for (int i = 0; i < n; i++){
      if(arr[i]<0)
         arr[i]=arr[i]*-1;
      sum += arr[i];
   }
   return sum;
}
// Driver Code
int main(){
   int arr[] = { -1, 3, 5, 17, -32, 12 };
   int n = 6;
   printf("Maximized difference between subsets : %d", subsetDifference(arr, n));
   return 0;
}

輸出

如果我們執行上述程式碼,它將生成以下輸出 -

Maximized difference between two subsets: 70

更新於: 2020-08-17

166 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告