给定一个正整数N ,任务是找出加到给定整数N上的所有正整数组合。该程序应仅打印组合,而不打印排列,并且组合中的所有整数都必须是唯一的。例如,对于输入3,应打印1、2或2、1,并且不得打印1、1、1,因为整数没有区别。
例子:
Input: N = 3
Output:
1 2
3
Input: N = 7
Output:
1 2 4
1 6
2 5
3 4
7
方法:该方法是此处讨论的方法的扩展。用来获得所有不同元素的想法是,首先我们找到所有相加得到N的元素。然后,我们遍历每个元素,并将元素存储到集合中。将元素存储到集合中会删除所有重复的元素,然后,我们将集合中元素的总和加起来,然后检查它是否等于N。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
/* arr[] to store all the distinct elements
index - next location in array
num - given number
reducedNum - reduced number */
void findCombinationsUtil(int arr[], int index,
int n, int red_num)
{
// Set to store all the
// distinct elements
set s;
int sum = 0;
// Base condition
if (red_num < 0) {
return;
}
if (red_num == 0) {
// Iterate over all the elements
// and store it into the set
for (int i = 0; i < index; i++) {
s.insert(arr[i]);
}
// Calculate the sum of all
// the elements of the set
for (auto itr = s.begin();
itr != s.end(); itr++) {
sum = sum + (*itr);
}
// Compare whether the sum is equal to n or not,
// if it is equal to n print the numbers
if (sum == n) {
for (auto i = s.begin();
i != s.end(); i++) {
cout << *i << " ";
}
cout << endl;
return;
}
}
// Find previous number stored in the array
int prev = (index == 0) ? 1 : arr[index - 1];
for (int k = prev; k <= n; k++) {
// Store all the numbers recursively
// into the arr[]
arr[index] = k;
findCombinationsUtil(arr, index + 1,
n, red_num - k);
}
}
// Function to find all the
// distinct combinations of n
void findCombinations(int n)
{
int a[n];
findCombinationsUtil(a, 0, n, n);
}
// Driver code
int main()
{
int n = 7;
findCombinations(n);
return 0;
}
Java
// Java implementation of the approach
import java.util.*;
class GFG
{
/* arr[] to store all the distinct elements
index - next location in array
num - given number
reducedNum - reduced number */
static void findCombinationsUtil(int arr[], int index,
int n, int red_num)
{
// Set to store all the
// distinct elements
HashSet s = new HashSet<>();
int sum = 0;
// Base condition
if (red_num < 0)
{
return;
}
if (red_num == 0)
{
// Iterate over all the elements
// and store it into the set
for (int i = 0; i < index; i++)
{
s.add(arr[i]);
}
// Calculate the sum of all
// the elements of the set
for (Integer itr : s)
{
sum = sum + itr;
}
// Compare whether the sum is equal to n or not,
// if it is equal to n print the numbers
if (sum == n)
{
for (Integer i : s)
{
System.out.print(i+" ");
}
System.out.println();
return;
}
}
// Find previous number stored in the array
int prev = (index == 0) ? 1 : arr[index - 1];
for (int k = prev; k <= n; k++)
{
// Store all the numbers recursively
// into the arr[]
if(index < n)
{
arr[index] = k;
findCombinationsUtil(arr, index + 1,
n, red_num - k);
}
}
}
// Function to find all the
// distinct combinations of n
static void findCombinations(int n)
{
int []a = new int[n];
findCombinationsUtil(a, 0, n, n);
}
// Driver code
public static void main(String arr[])
{
int n = 7;
findCombinations(n);
}
}
/* This code contributed by PrinciRaj1992 */
Python3
# Python3 implementation of the approach
# arr[] to store all the distinct elements
# index - next location in array
# num - given number
# reducedNum - reduced number
def findCombinationsUtil(arr, index, n, red_num):
# Set to store all the
# distinct elements
s = set()
sum = 0
# Base condition
if (red_num < 0):
return
if (red_num == 0):
# Iterate over all the elements
# and store it into the set
for i in range(index):
s.add(arr[i])
# Calculate the sum of all
# the elements of the set
for itr in s:
sum = sum + (itr)
# Compare whether the sum is equal to n or not,
# if it is equal to n print the numbers
if (sum == n):
for i in s:
print(i, end = " ")
print("\n", end = "")
return
# Find previous number stored in the array
if (index == 0):
prev = 1
else:
prev = arr[index - 1]
for k in range(prev, n + 1, 1):
# Store all the numbers recursively
# into the arr[]
arr[index] = k
findCombinationsUtil(arr, index + 1,
n, red_num - k)
# Function to find all the
# distinct combinations of n
def findCombinations(n):
a = [0 for i in range(n + 1)]
findCombinationsUtil(a, 0, n, n)
# Driver code
if __name__ == '__main__':
n = 7
findCombinations(n)
# This code is contributed by Surendra_Gangwar
C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
class GFG
{
/* arr[] to store all the distinct elements
index - next location in array
num - given number
reducedNum - reduced number */
static void findCombinationsUtil(int []arr, int index,
int n, int red_num)
{
// Set to store all the
// distinct elements
HashSet s = new HashSet();
int sum = 0;
// Base condition
if (red_num < 0)
{
return;
}
if (red_num == 0)
{
// Iterate over all the elements
// and store it into the set
for (int i = 0; i < index; i++)
{
s.Add(arr[i]);
}
// Calculate the sum of all
// the elements of the set
foreach (int itr in s)
{
sum = sum + itr;
}
// Compare whether the sum is equal to n or not,
// if it is equal to n print the numbers
if (sum == n)
{
foreach (int i in s)
{
Console.Write(i+" ");
}
Console.WriteLine();
return;
}
}
// Find previous number stored in the array
int prev = (index == 0) ? 1 : arr[index - 1];
for (int k = prev; k <= n; k++)
{
// Store all the numbers recursively
// into the arr[]
if(index < n)
{
arr[index] = k;
findCombinationsUtil(arr, index + 1,
n, red_num - k);
}
}
}
// Function to find all the
// distinct combinations of n
static void findCombinations(int n)
{
int []a = new int[n];
findCombinationsUtil(a, 0, n, n);
}
// Driver code
public static void Main(String []arr)
{
int n = 7;
findCombinations(n);
}
}
// This code contributed by Rajput-Ji
输出:
1 2 4
1 6
2 5
3 4
7