📜  打印不同数字的组合,它们的总和为N

📅  最后修改于: 2021-04-22 09:48:42             🧑  作者: Mango

给定一个正整数N ,任务是找出加到给定整数N上的所有正整数组合。该程序应仅打印组合,而不打印排列,并且组合中的所有整数都必须是唯一的。例如,对于输入3,应打印1、2或2、1,并且不得打印1、1、1,因为整数没有区别。

例子:

方法:该方法是此处讨论的方法的扩展。用来获得所有不同元素的想法是,首先我们找到所有相加得到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