📜  所有等于K的唯一组合

📅  最后修改于: 2021-04-23 06:21:51             🧑  作者: Mango

给定大小为N的数组arr []和整数K。任务是从给定数组中找到所有唯一组合,以使每个组合中的元素之和等于K。

例子:

方法:某些元素可以在给定数组中重复。确保迭代这些元素的出现次数,以避免重复组合。一旦这样做,事情就很简单了。用剩余的总和调用一个递归函数并使索引向前移动。当总和达到K时,打印选择所有元素以获得该总和。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
// Function to find all unique combination of
// given elements such that their sum is K
void unique_combination(int l, int sum, int K,
                        vector& local,
                        vector& A)
{
    // If a unique combination is found
    if (sum == K) {
        cout << "{";
        for (int i = 0; i < local.size(); i++)
        {
            if (i != 0)
                cout << " ";
            cout << local[i];
            if (i != local.size() - 1)
                cout << ", ";
        }
        cout << "}" << endl;
        return;
    }
 
    // For all other combinations
    for (int i = l; i < A.size(); i++)
    {
 
        // Check if the sum exceeds K
        if (sum + A[i] > K)
            continue;
 
        // Check if it is repeated or not
        if (i > l and A[i] == A[i - 1])
            continue;
 
        // Take the element into the combination
        local.push_back(A[i]);
 
        // Recursive call
        unique_combination(i + 1, sum + A[i], K, local, A);
 
        // Remove element from the combination
        local.pop_back();
    }
}
 
// Function to find all combination
// of the given elements
void Combination(vector A, int K)
{
    // Sort the given elements
    sort(A.begin(), A.end());
 
    // To store combination
    vector local;
 
    unique_combination(0, 0, K, local, A);
}
 
// Driver code
int main()
{
    vector A = { 10, 1, 2, 7, 6, 1, 5 };
 
    int K = 8;
 
    // Function call
    Combination(A, K);
 
    return 0;
}


Java
// Java implementation of the approach
import java.util.*;
 
class GFG {
 
    // Function to find all unique combination of
    // given elements such that their sum is K
    static void unique_combination(int l, int sum, int K,
                                   Vector local,
                                   Vector A)
    {
        // If a unique combination is found
        if (sum == K) {
            System.out.print("{");
            for (int i = 0; i < local.size(); i++) {
                if (i != 0)
                    System.out.print(" ");
                System.out.print(local.get(i));
                if (i != local.size() - 1)
                    System.out.print(", ");
            }
            System.out.println("}");
            return;
        }
 
        // For all other combinations
        for (int i = l; i < A.size(); i++) {
 
            // Check if the sum exceeds K
            if (sum + A.get(i) > K)
                continue;
 
            // Check if it is repeated or not
            if (i > l && A.get(i) == A.get(i - 1) )
                continue;
 
            // Take the element into the combination
            local.add(A.get(i));
 
            // Recursive call
            unique_combination(i + 1, sum + A.get(i), K,
                               local, A);
 
            // Remove element from the combination
            local.remove(local.size() - 1);
        }
    }
 
    // Function to find all combination
    // of the given elements
    static void Combination(Vector A, int K)
    {
        // Sort the given elements
        Collections.sort(A);
 
        // To store combination
        Vector local = new Vector();
 
        unique_combination(0, 0, K, local, A);
    }
 
    // Driver code
    public static void main(String[] args)
    {
        Integer[] arr = { 10, 1, 2, 7, 6, 1, 5 };
        Vector A
            = new Vector<>(Arrays.asList(arr));
 
        int K = 8;
 
        // Function call
        Combination(A, K);
    }
}
 
// This code is contributed by PrinciRaj1992


Python3
# Python 3 implementation of the approach
 
# Function to find all unique combination of
# given elements such that their sum is K
 
 
def unique_combination(l, sum, K, local, A):
 
    # If a unique combination is found
    if (sum == K):
        print("{", end="")
        for i in range(len(local)):
            if (i != 0):
                print(" ", end="")
            print(local[i], end="")
            if (i != len(local) - 1):
                print(", ", end="")
        print("}")
        return
 
    # For all other combinations
    for i in range(l, len(A), 1):
 
        # Check if the sum exceeds K
        if (sum + A[i] > K):
            continue
 
        # Check if it is repeated or not
        if (i > l and
                A[i] == A[i - 1]):
            continue
 
        # Take the element into the combination
        local.append(A[i])
 
        # Recursive call
        unique_combination(i + 1, sum + A[i],
                           K, local, A)
 
        # Remove element from the combination
        local.remove(local[len(local) - 1])
 
# Function to find all combination
# of the given elements
 
 
def Combination(A, K):
 
    # Sort the given elements
    A.sort(reverse=False)
 
    local = []
 
    unique_combination(0, 0, K, local, A)
 
 
# Driver code
if __name__ == '__main__':
    A = [10, 1, 2, 7, 6, 1, 5]
 
    K = 8
 
    # Function call
    Combination(A, K)
 
# This code is contributed by
# Surendra_Gangwar


C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
 
class GFG {
 
    // Function to find all unique combination of
    // given elements such that their sum is K
    static void unique_combination(int l, int sum, int K,
                                   List local,
                                   List A)
    {
        // If a unique combination is found
        if (sum == K)
        {
            Console.Write("{");
            for (int i = 0; i < local.Count; i++)
            {
                if (i != 0)
                    Console.Write(" ");
                Console.Write(local[i]);
                if (i != local.Count - 1)
                    Console.Write(", ");
            }
            Console.WriteLine("}");
            return;
        }
 
        // For all other combinations
        for (int i = l; i < A.Count; i++)
        {
            // Check if the sum exceeds K
            if (sum + A[i] > K)
                continue;
 
            // Check if it is repeated or not
            if (i >l && A[i] == A[i - 1])
                continue;
 
            // Take the element into the combination
            local.Add(A[i]);
 
            // Recursive call
            unique_combination(i + 1, sum + A[i], K, local,
                               A);
 
            // Remove element from the combination
            local.RemoveAt(local.Count - 1);
        }
    }
 
    // Function to find all combination
    // of the given elements
    static void Combination(List A, int K)
    {
        // Sort the given elements
        A.Sort();
 
        // To store combination
        List local = new List();
 
        unique_combination(0, 0, K, local, A);
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        int[] arr = { 10, 1, 2, 7, 6, 1, 5 };
        List A = new List(arr);
 
        int K = 8;
 
        // Function call
        Combination(A, K);
    }
}
 
// This code is contributed by Rajput-Ji


输出
{1,  1,  6}
{1,  2,  5}
{1,  7}
{2,  6}