📌  相关文章
📜  将数组划分为两个子集,以使两个子集的和的平方和最大

📅  最后修改于: 2021-04-29 13:52:40             🧑  作者: Mango

给定一个整数数组arr [] ,任务是将该数组分成两个非空子集,以使两个子集之和的平方和为最大,并且两个子集的大小之差不得超过1 。

例子:

方法:任务是最大化a 2 + b 2的总和,其中ab是两个子集的总和,而a + b = C (常数),即整个数组的总和。可以通过对数组进行排序并将一个子集中的前N / 2 – 1个较小的元素除以另一个子集中的其余N / 2 + 1个元素,来获得最大的总和。这样,可以在使大小之差最大为1的同时,使总和最大化。

下面是上述方法的实现:

C++
// C++ implementation of the approach
  
#include 
using namespace std;
  
// Function to return the maximum sum of the
// square of the sum of two subsets of an array
int maxSquareSubsetSum(int* A, int N)
{
    // Initialize variables to store
    // the sum of subsets
    int sub1 = 0, sub2 = 0;
  
    // Sorting the array
    sort(A, A + N);
  
    // Loop through the array
    for (int i = 0; i < N; i++) {
  
        // Sum of the first subset
        if (i < (N / 2) - 1)
            sub1 += A[i];
  
        // Sum of the second subset
        else
            sub2 += A[i];
    }
  
    // Return the maximum sum of
    // the square of the sum of subsets
    return sub1 * sub1 + sub2 * sub2;
}
  
// Driver code
int main()
{
    int arr[] = { 7, 2, 13, 4, 25, 8 };
    int N = sizeof(arr) / sizeof(arr[0]);
  
    cout << maxSquareSubsetSum(arr, N);
  
    return 0;
}


Java
// Java implementation of the approach
import java.util.*;
  
class GFG 
{
      
    // Function to return the maximum sum of the 
    // square of the sum of two subsets of an array 
    static int maxSquareSubsetSum(int []A, int N) 
    { 
        // Initialize variables to store 
        // the sum of subsets 
        int sub1 = 0, sub2 = 0; 
      
        // Sorting the array 
        Arrays.sort(A); 
      
        // Loop through the array 
        for (int i = 0; i < N; i++) 
        { 
      
            // Sum of the first subset 
            if (i < (N / 2) - 1) 
                sub1 += A[i]; 
      
            // Sum of the second subset 
            else
                sub2 += A[i]; 
        } 
      
        // Return the maximum sum of 
        // the square of the sum of subsets 
        return sub1 * sub1 + sub2 * sub2; 
    } 
      
    // Driver code 
    public static void main (String[] args)
    { 
        int arr[] = { 7, 2, 13, 4, 25, 8 }; 
        int N = arr.length; 
      
        System.out.println(maxSquareSubsetSum(arr, N));
    } 
}
  
// This code is contributed by AnkitRai01


Python3
# Python3 implementation of the approach 
  
# Function to return the maximum sum of the 
# square of the sum of two subsets of an array 
def maxSquareSubsetSum(A, N) :
  
    # Initialize variables to store 
    # the sum of subsets 
    sub1 = 0; sub2 = 0;
      
    # Sorting the array
    A.sort();
  
    # Loop through the array 
    for i in range(N) :
  
        # Sum of the first subset 
        if (i < (N // 2) - 1) :
            sub1 += A[i]; 
  
        # Sum of the second subset 
        else :
            sub2 += A[i]; 
  
    # Return the maximum sum of 
    # the square of the sum of subsets 
    return sub1 * sub1 + sub2 * sub2; 
  
# Driver code 
if __name__ == "__main__" : 
  
    arr = [ 7, 2, 13, 4, 25, 8 ]; 
    N = len(arr); 
  
    print(maxSquareSubsetSum(arr, N)); 
  
# This code is contributed by AnkitRai01


C#
// C# implementation of the approach
using System;
  
class GFG 
{
      
    // Function to return the maximum sum of the 
    // square of the sum of two subsets of an array 
    static int maxSquareSubsetSum(int []A, int N) 
    { 
        // Initialize variables to store 
        // the sum of subsets 
        int sub1 = 0, sub2 = 0; 
      
        // Sorting the array 
        Array.Sort(A); 
      
        // Loop through the array 
        for (int i = 0; i < N; i++) 
        { 
      
            // Sum of the first subset 
            if (i < (N / 2) - 1) 
                sub1 += A[i]; 
      
            // Sum of the second subset 
            else
                sub2 += A[i]; 
        } 
      
        // Return the maximum sum of 
        // the square of the sum of subsets 
        return sub1 * sub1 + sub2 * sub2; 
    } 
      
    // Driver code 
    public static void Main()
    { 
        int []arr = { 7, 2, 13, 4, 25, 8 }; 
        int N = arr.Length; 
      
        Console.WriteLine(maxSquareSubsetSum(arr, N));
    } 
}
  
// This code is contributed by AnkitRai01


输出:
2845

时间复杂度: O(N * log(N))