Maximum Weight Difference
Last Updated :
19 Sep, 2023
You are given an array W[1], W[2], …, W[N]. Choose K numbers among them such that the absolute difference between the sum of chosen numbers and the sum of remaining numbers is as large as possible.
Examples :
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
There are two possibilities to get the desired answer. These two are: Choose k largest numbers or Choose k smallest numbers. Choose the best-suited option which fits according to the given values. This is because there are some cases in which the sum of smallest k numbers can be greater than rest of the array and there are some cases in which the sum of largest k numbers can be greater than rest of the sum of the numbers.
Approach :
- Sort the given array.
- Get the sum of all the numbers of the array and store it in sum
- Get the sum of first k numbers of the array and store it in sum1
- Get the sum of last k numbers of the array and store it in sum2
- Output the result which is : max(abs(S1-(S-S1)), abs(S2-(S-S2)))
Implementation:
C++
#include <iostream>
#include <algorithm>
using namespace std;
int solve( int array[], int n, int k)
{
sort(array, array + n);
int sum = 0, sum1 = 0, sum2 = 0;
for ( int i = 0; i < n; i++) {
sum += array[i];
}
for ( int i = 0; i < k; i++) {
sum1 += array[i];
}
sort(array, array+n, greater< int >());
for ( int i = 0; i < k; i++) {
sum2 += array[i];
}
return max( abs (sum1 - (sum - sum1)), abs (sum2 -
(sum - sum2)));
}
int main()
{
int k = 2;
int array[] = { 8, 4, 5, 2, 10 };
int n = sizeof (array) / sizeof (array[0]);
cout << solve(array, n, k);
return 0;
}
|
Java
import java.util.*;
class GFG {
public static int solve( int array[], int n,
int k)
{
Arrays.sort(array);
int sum = 0 , sum1 = 0 , sum2 = 0 ;
for ( int i = 0 ; i < n; i++) {
sum += array[i];
}
for ( int i = 0 ; i < k; i++) {
sum1 += array[i];
}
for ( int i = k; i < n; i++) {
sum2 += array[i];
}
return Math.max(Math.abs(sum1 - (sum - sum1)),
Math.abs(sum2 - (sum - sum2)));
}
public static void main(String[] args)
{
int k = 2 ;
int array[] = { 8 , 4 , 5 , 2 , 10 };
int n = array.length;
System.out.print(solve(array, n, k));
}
}
|
Python
def solve(array, k):
array.sort()
s = sum (array)
s1 = sum (array[:k])
array.sort(reverse = True )
s2 = sum (array[:k])
return max ( abs (s1 - (s - s1)), abs (s2 - (s - s2)))
k = 2
array = [ 8 , 4 , 5 , 2 , 10 ]
print (solve(array, k))
|
C#
using System;
class GFG {
public static int solve( int []array, int n,
int k)
{
Array.Sort(array);
int sum = 0, sum1 = 0, sum2 = 0;
for ( int i = 0; i < n; i++) {
sum += array[i];
}
for ( int i = 0; i < k; i++) {
sum1 += array[i];
}
for ( int i = k; i < n; i++) {
sum2 += array[i];
}
return Math.Max(Math.Abs(sum1 - (sum - sum1)),
Math.Abs(sum2 - (sum - sum2)));
}
public static void Main()
{
int k = 2;
int []array = { 8, 4, 5, 2, 10 };
int n = array.Length;
Console.WriteLine(solve(array, n, k));
}
}
|
PHP
<?php
function maxi( $a , $b )
{
if ( $a > $b )
{
return $a ;
}
else
{
return $b ;
}
}
function solve(& $arr , $n , $k )
{
sort( $arr );
$sum = 0;
$sum1 = 0;
$sum2 = 0;
for ( $i = 0; $i < $n ; $i ++)
{
$sum += $arr [ $i ];
}
for ( $i = 0; $i < $k ; $i ++)
{
$sum1 += $arr [ $i ];
}
for ( $i = $k ; $i < $n ; $i ++)
{
$sum2 += $arr [ $i ];
}
return maxi( abs ( $sum1 - ( $sum - $sum1 )),
abs ( $sum2 - ( $sum - $sum2 )));
}
$k = 2;
$arr = array (8, 4, 5, 2, 10 );
$n = sizeof( $arr );
echo (solve( $arr , $n , $k ));
?>
|
Javascript
<script>
function solve(array, n, k)
{
array.sort( function (a, b){ return a - b});
let sum = 0, sum1 = 0, sum2 = 0;
for (let i = 0; i < n; i++) {
sum += array[i];
}
for (let i = 0; i < k; i++) {
sum1 += array[i];
}
for (let i = k; i < n; i++) {
sum2 += array[i];
}
return Math.max(Math.abs(sum1 - (sum - sum1)),
Math.abs(sum2 - (sum - sum2)));
}
let k = 2;
let array = [ 8, 4, 5, 2, 10 ];
let n = array.length;
document.write(solve(array, n, k));
</script>
|
Time Complexity: O(n log n), where n is the length of the array.
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...