给定大小为N的数组arr []和整数K。任务是从给定数组中找到所有唯一组合,以使每个组合中的元素之和等于K。
例子:
Input: arr[] = {1, 2, 3}, K = 3
Output:
{1, 2}
{3}
Exaplantion:
These are the combinations whose sum equals to 3.
Input: arr[] = {2, 2, 2}, K = 4
Output:
{2, 2}
方法:某些元素可以在给定数组中重复。确保迭代这些元素的出现次数,以避免重复组合。一旦这样做,事情就很简单了。用剩余的总和调用一个递归函数并使索引向前移动。当总和达到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}