📜  最大重量差

📅  最后修改于: 2022-05-13 01:57:51.249000             🧑  作者: Mango

最大重量差

给定一个数组 W[1], W[2], ..., W[N]。选择其中的K个数,使得所选择的数之和与其余数之和的绝对差值尽可能大。
例子 :

Input : arr[] = [8, 4, 5, 2, 10]
            k = 2
Output: 17

Input : arr[] = [1, 1, 1, 1, 1, 1, 1, 1]
          k = 3
Output: 2

有两种可能得到想要的答案。这两个是:选择k个最大的数字或选择k个最小的数字。根据给定值选择最适合的选项。这是因为在某些情况下,最小 k 个数字的总和可能大于数组的其余部分,并且在某些情况下,最大 k 个数字的总和可能大于其余数字的总和。
方法 :

  • 对给定的数组进行排序。
  • 获取数组所有数字的总和,并将其存储在sum
  • 获取数组前k个数之和,存入sum1
  • 获取数组最后k个数之和,存入sum2
  • 输出结果为: max(abs(S1-(S-S1)), abs(S2-(S-S2)))

C++
// C++ Program to find maximum weight
// difference
#include 
#include 
using namespace std;
 
// return the max value of two numbers
 
int solve(int array[], int n, int k)
{
    // sort the given array
    sort(array, array + n);
 
    // Initializing the value to 0
    int sum = 0, sum1 = 0, sum2 = 0;
 
    // Getting the sum of the array
    for (int i = 0; i < n; i++) {
        sum += array[i];
    }
 
    // Getting the sum of smallest k elements
    for (int i = 0; i < k; i++) {
        sum1 += array[i];
    }
    sort(array, array+n, greater());
    // Getting the sum of k largest elements
    for (int i = 0; i < k; i++) {
        sum2 += array[i];
    }
 
    // Returning the maximum possible difference.
    return max(abs(sum1 - (sum - sum1)), abs(sum2 -
                                  (sum - sum2)));
}
 
// Driver function
int main()
{
    int k = 2;
    int array[] = { 8, 4, 5, 2, 10 };
 
    // calculate the numbers of elements in the array
    int n = sizeof(array) / sizeof(array[0]);
 
    // call the solve function
    cout << solve(array, n, k);
 
    return 0;
}


Java
// JAVA Code for Maximum Weight Difference
import java.util.*;
 
class GFG {
     
    public static int solve(int array[], int n,
                                        int k)
    {
        // sort the given array
        Arrays.sort(array);
      
        // Initializing the value to 0
        int sum = 0, sum1 = 0, sum2 = 0;
      
        // Getting the sum of the array
        for (int i = 0; i < n; i++) {
            sum += array[i];
        }
      
        // Getting the sum of first k elements
        for (int i = 0; i < k; i++) {
            sum1 += array[i];
        }
      
        // Getting the sum of (n-k) elements
        for (int i = k; i < n; i++) {
            sum2 += array[i];
        }
      
        // Returning the maximum possible difference.
        return Math.max(Math.abs(sum1 - (sum - sum1)),
                       Math.abs(sum2 - (sum - sum2)));
    }
     
    /* Driver program to test above function */
    public static void main(String[] args)
    {
        int k = 2;
        int array[] = { 8, 4, 5, 2, 10 };
      
        // calculate the numbers of elements
        // in the array
        int n = array.length;
      
        // call the solve function
        System.out.print(solve(array, n, k));
             
    }
}
// This code is contributed by Arnav Kr. Mandal.


Python
def solve(array, k):
   
  # Sorting array
  array.sort()
 
  # Getting the sum of all the elements
  s = sum(array)
 
  # Getting the sum of smallest k elements
  s1 = sum(array[:k])
 
  # Getting the sum greatest k elements
  array.sort(reverse=True)
  s2 = sum(array[:k])
 
  # Returning the maximum possible difference
  return max(abs(s1-(s-s1)), abs(s2-(s-s2)))
   
# Driver function
k = 2
array =[8, 4, 5, 2, 10]
print(solve(array, k))


C#
// C# Code for Maximum Weight Difference
using System;
 
class GFG {
     
    public static int solve(int []array, int n,
                                        int k)
    {
         
        // sort the given array
        Array.Sort(array);
     
        // Initializing the value to 0
        int sum = 0, sum1 = 0, sum2 = 0;
     
        // Getting the sum of the array
        for (int i = 0; i < n; i++) {
            sum += array[i];
        }
     
        // Getting the sum of first k elements
        for (int i = 0; i < k; i++) {
            sum1 += array[i];
        }
     
        // Getting the sum of (n-k) elements
        for (int i = k; i < n; i++) {
            sum2 += array[i];
        }
     
        // Returning the maximum possible difference.
        return Math.Max(Math.Abs(sum1 - (sum - sum1)),
                        Math.Abs(sum2 - (sum - sum2)));
    }
     
    /* Driver program to test above function */
    public static void Main()
    {
        int k = 2;
        int []array = { 8, 4, 5, 2, 10 };
     
        // calculate the numbers of elements
        // in the array
        int n = array.Length;
     
        // call the solve function
        Console.WriteLine(solve(array, n, k));
             
    }
}
 
// This code is contributed by vt_m.


PHP
 $b)
    {
        return $a;
    }
    else
    {
        return $b;
    }
}
 
function solve(&$arr, $n, $k)
{
    // sort the given array
    sort($arr);
 
    // Initializing the value to 0
    $sum = 0;
    $sum1 = 0;
    $sum2 = 0;
 
    // Getting the sum of the array
    for ($i = 0; $i < $n; $i++)
    {
        $sum += $arr[$i];
    }
 
    // Getting the sum of first k elements
    for ($i = 0; $i < $k; $i++)
    {
        $sum1 += $arr[$i];
    }
 
    // Getting the sum of (n-k) elements
    for ($i = $k; $i < $n; $i++)
    {
        $sum2 += $arr[$i];
    }
 
    // Returning the maximum possible difference.
    return maxi(abs($sum1 - ($sum - $sum1)),
                abs($sum2 - ($sum - $sum2)));
}
 
// DriverCode
$k = 2;
$arr = array(8, 4, 5, 2, 10 );
 
// calculate the numbers of
// elements in the array
$n = sizeof($arr);
 
// call the solve function
echo (solve($arr, $n, $k));
 
// This code is contributed
// by Shivi_Aggarwal
?>


Javascript


输出
17