最大重量差
给定一个数组 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