📜  查找两个相等和子序列的所有组合

📅  最后修改于: 2021-04-29 14:12:54             🧑  作者: Mango

给定整数数组arr [] ,任务是找到将数组拆分为两个子序列的所有可能方式,以使两个子序列中元素的总和相等。数组中的每个数字必须仅属于两个子序列之一。打印两个子序列的所有可能组合。

例子:

方法:一种简单的解决方案是使用递归形成所有可能的子序列对,并比较两个子序列中元素的总和。对于每个数组元素,我们有两个选择,我们可以将当前元素放在第一个子序列中,也可以选择第二个子序列。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
#define MAX 100000
  
// Function to print the subsequence elements
void print(int g1[], int a, int g2[], int b)
{
  
    // Prints elements of the 1st subarray
    for (int i = 0; i < a; i++) {
        cout << g1[i] << " ";
    }
    cout << "and ";
  
    // Prints elements of the 2nd subarray
    for (int i = 0; i < b; i++) {
        cout << g2[i] << " ";
    }
    cout << endl;
}
  
// Function that returns true if the sum of the
// elements of arrays g1[] and g2[] is equal
bool checksum(int g1[], int a, int g2[], int b)
{
    int i, x;
  
    // Adding elements of the 1st array
    for (i = 0, x = 0; i < a; i++) {
        x += g1[i];
    }
  
    // Subtracting elements of the 2nd array
    for (i = 0; i < b; i++) {
        x -= g2[i];
    }
  
    // If x is 0 then the sum of elements
    // in both the arrays is equal
    return (x == 0);
}
  
// Function to find all valid subsequences
void formgroups(int arr[], int x, int g1[], int a,
                int g2[], int b, int n)
{
    // Base Case
    if (x == n) {
  
        // If sum of the two subsequences
        // is equal then print the elements
        if (checksum(g1, a, g2, b)) {
  
            // Print the subsequences
            print(g1, a, g2, b);
        }
        return;
    }
  
    // Recursive Case
  
    // Choose current element to be a
    // part of the first subsequence
    g1[a] = arr[x];
    formgroups(arr, x + 1, g1, a + 1, g2, b, n);
  
    // Choose current element to be a
    // part of the second subsequence
    g2[b] = arr[x];
    formgroups(arr, x + 1, g1, a, g2, b + 1, n);
}
  
// Driver code
int main()
{
    int arr[] = { 1, 2, 3, 9, 4, 5 };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    int g1[MAX], g2[MAX];
    formgroups(arr, 0, g1, 0, g2, 0, n);
  
    return 0;
}


Java
// Java implementation of the approach
import java.util.*;
  
class GFG 
{
static int MAX = 100000;
  
// Function to print the 
// subsequence elements
static void print(int g1[], int a, 
                  int g2[], int b)
{
  
    // Prints elements of the 1st subarray
    for (int i = 0; i < a; i++)
    {
        System.out.print(g1[i] + " ");
    }
    System.out.print("and ");
  
    // Prints elements of the 2nd subarray
    for (int i = 0; i < b; i++) 
    {
        System.out.print(g2[i] + " ");
    }
    System.out.println();
}
  
// Function that returns true if 
// the sum of the elements of 
// arrays g1[] and g2[] is equal
static boolean checksum(int g1[], int a, 
                        int g2[], int b)
{
    int i, x;
  
    // Adding elements of the 1st array
    for (i = 0, x = 0; i < a; i++) 
    {
        x += g1[i];
    }
  
    // Subtracting elements of 
    // the 2nd array
    for (i = 0; i < b; i++)
    {
        x -= g2[i];
    }
  
    // If x is 0 then the sum of elements
    // in both the arrays is equal
    return (x == 0);
}
  
// Function to find all valid subsequences
static void formgroups(int arr[], int x, 
                       int g1[], int a, 
                       int g2[], int b, int n)
{
    // Base Case
    if (x == n) 
    {
  
        // If sum of the two subsequences
        // is equal then print the elements
        if (checksum(g1, a, g2, b)) 
        {
  
            // Print the subsequences
            print(g1, a, g2, b);
        }
        return;
    }
  
    // Recursive Case
  
    // Choose current element to be a
    // part of the first subsequence
    g1[a] = arr[x];
    formgroups(arr, x + 1, g1, 
                    a + 1, g2, b, n);
  
    // Choose current element to be a
    // part of the second subsequence
    g2[b] = arr[x];
    formgroups(arr, x + 1, g1, a, 
                g2, b + 1, n);
}
  
// Driver code
public static void main(String[] args) 
{
    int arr[] = { 1, 2, 3, 9, 4, 5 };
    int n = arr.length;
  
    int []g1 = new int[MAX];
    int []g2 = new int[MAX];
    formgroups(arr, 0, g1, 0, g2, 0, n);
}
}
  
// This code is contributed by PrinciRaj1992


Python3
# Python 3 implementation of the approach
MAX = 100000
  
# Function to print the subsequence elements
def prints(g1, a, g2, b):
      
    # Prints elements of the 1st subarray
    for i in range(a):
        print(g1[i], end = " ")
      
    print("and ", end = "")
  
    # Prints elements of the 2nd subarray
    for i in range(b):
        print(g2[i], end = " ")
      
    print("\n", end = "")
  
# Function that returns true if the sum of the
# elements of arrays g1[] and g2[] is equal
def checksum(g1, a, g2, b):
      
    # Adding elements of the 1st array
    x = 0
    for i in range(0, a, 1):
        x += g1[i]
  
    # Subtracting elements of the 2nd array
    for i in range(b):
        x -= g2[i]
  
    # If x is 0 then the sum of elements
    # in both the arrays is equal
    return (x == 0)
  
# Function to find all valid subsequences
def formgroups(arr, x, g1, a, g2, b, n):
      
    # Base Case
    if (x == n):
          
        # If sum of the two subsequences
        # is equal then print the elements
        if (checksum(g1, a, g2, b)):
              
            # Print the subsequences
            prints(g1, a, g2, b)
  
        return
  
    # Recursive Case
  
    # Choose current element to be a
    # part of the first subsequence
    g1[a] = arr[x]
    formgroups(arr, x + 1, g1, a + 1, g2, b, n)
  
    # Choose current element to be a
    # part of the second subsequence
    g2[b] = arr[x]
    formgroups(arr, x + 1, g1, a, g2, b + 1, n)
  
# Driver code
if __name__ == '__main__':
    arr = [1, 2, 3, 9, 4, 5]
    n = len(arr)
    g1 = [0 for i in range(MAX)]
    g2 = [0 for i in range(MAX)]
    formgroups(arr, 0, g1, 0, g2, 0, n)
  
# This code is contributed by
# Surendra_Gangwar


C#
// C# implementation of the approach
using System;
  
class GFG 
{
static int MAX = 100000;
  
// Function to print the 
// subsequence elements
static void print(int []g1, int a, 
                  int []g2, int b)
{
  
    // Prints elements of the 1st subarray
    for (int i = 0; i < a; i++)
    {
        Console.Write(g1[i] + " ");
    }
    Console.Write("and ");
  
    // Prints elements of the 2nd subarray
    for (int i = 0; i < b; i++) 
    {
        Console.Write(g2[i] + " ");
    }
    Console.WriteLine();
}
  
// Function that returns true if 
// the sum of the elements of 
// arrays g1[] and g2[] is equal
static bool checksum(int []g1, int a, 
                     int []g2, int b)
{
    int i, x;
  
    // Adding elements of the 1st array
    for (i = 0, x = 0; i < a; i++) 
    {
        x += g1[i];
    }
  
    // Subtracting elements of 
    // the 2nd array
    for (i = 0; i < b; i++)
    {
        x -= g2[i];
    }
  
    // If x is 0 then the sum of elements
    // in both the arrays is equal
    return (x == 0);
}
  
// Function to find all valid subsequences
static void formgroups(int []arr, int x, 
                       int []g1, int a, 
                       int []g2, int b, int n)
{
    // Base Case
    if (x == n) 
    {
  
        // If sum of the two subsequences
        // is equal then print the elements
        if (checksum(g1, a, g2, b)) 
        {
  
            // Print the subsequences
            print(g1, a, g2, b);
        }
        return;
    }
  
    // Recursive Case
  
    // Choose current element to be a
    // part of the first subsequence
    g1[a] = arr[x];
    formgroups(arr, x + 1, g1, 
                    a + 1, g2, b, n);
  
    // Choose current element to be a
    // part of the second subsequence
    g2[b] = arr[x];
    formgroups(arr, x + 1, g1, a, 
                g2, b + 1, n);
}
  
// Driver code
public static void Main() 
{
    int []arr = { 1, 2, 3, 9, 4, 5 };
    int n = arr.Length;
  
    int []g1 = new int[MAX];
    int []g2 = new int[MAX];
    formgroups(arr, 0, g1, 0, g2, 0, n);
}
}
  
// This code is contributed by anuj_67...


PHP


输出:
1 2 9 and 3 4 5 
1 2 4 5 and 3 9 
3 9 and 1 2 4 5 
3 4 5 and 1 2 9

时间复杂度: O(2 n )