📌  相关文章
📜  打印一组给定大小的所有子集

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

生成具有不同元素的给定数组的所有大小r的可能子集。

例子:

Input  : arr[] = {1, 2, 3, 4}
            r = 2
Output :  1 2
          1 3
          1 4
          2 3
          2 4
          3 4

Input  : arr[] = {10, 20, 30, 40, 50}
            r = 3
Output : 10 20 30 
         10 20 40 
         10 20 50 
         10 30 40 
         10 30 50 
         10 40 50 
         20 30 40 
         20 30 50 
         20 40 50 
         30 40 50 

此问题与在大小为n的给定数组中打印r个元素的所有可能组合相同。
这里的想法类似于子集和问题。我们一个接一个地考虑输入数组的每个元素,然后重复两种情况:
1)元素包含在当前组合中(我们将元素放入data []中,并在data []中增加下一个可用索引)
2)当前组合中不包含该元素(我们不放置该元素并且不更改索引)
当data []中的元素数等于r(组合的大小)时,我们将其打印出来。
该方法主要基于Pascal的Identity,即n cr = n-1 cr + n-1 cr-1

C++
// C++ Program to print all combination of size r in
// an array of size n
#include 
void combinationUtil(int arr[], int n, int r,
                     int index, int data[], int i);
 
// The main function that prints all combinations of
// size r in arr[] of size n. This function mainly
// uses combinationUtil()
void printCombination(int arr[], int n, int r)
{
    // A temporary array to store all combination
    // one by one
    int data[r];
 
    // Print all combination using temprary array 'data[]'
    combinationUtil(arr, n, r, 0, data, 0);
}
 
/* arr[]  ---> Input Array
   n      ---> Size of input array
   r      ---> Size of a combination to be printed
   index  ---> Current index in data[]
   data[] ---> Temporary array to store current combination
   i      ---> index of current element in arr[]     */
void combinationUtil(int arr[], int n, int r, int index,
                     int data[], int i)
{
    // Current combination is ready, print it
    if (index == r) {
        for (int j = 0; j < r; j++)
            printf("%d ", data[j]);
        printf("\n");
        return;
    }
 
    // When no more elements are there to put in data[]
    if (i >= n)
        return;
 
    // current is included, put next at next location
    data[index] = arr[i];
    combinationUtil(arr, n, r, index + 1, data, i + 1);
 
    // current is excluded, replace it with next
    // (Note that i+1 is passed, but index is not
    // changed)
    combinationUtil(arr, n, r, index, data, i + 1);
}
 
// Driver program to test above functions
int main()
{
    int arr[] = { 10, 20, 30, 40, 50 };
    int r = 3;
    int n = sizeof(arr) / sizeof(arr[0]);
    printCombination(arr, n, r);
    return 0;
}


Java
// Java program to print all combination of size
// r in an array of size n
import java.io.*;
 
class Permutation {
 
    /* arr[]  ---> Input Array
    data[] ---> Temporary array to store current combination
    start & end ---> Staring and Ending indexes in arr[]
    index  ---> Current index in data[]
    r ---> Size of a combination to be printed */
    static void combinationUtil(int arr[], int n, int r,
                          int index, int data[], int i)
    {
        // Current combination is ready to be printed,
        // print it
        if (index == r) {
            for (int j = 0; j < r; j++)
                System.out.print(data[j] + " ");
            System.out.println("");
            return;
        }
 
        // When no more elements are there to put in data[]
        if (i >= n)
            return;
 
        // current is included, put next at next
        // location
        data[index] = arr[i];
        combinationUtil(arr, n, r, index + 1,
                               data, i + 1);
 
        // current is excluded, replace it with
        // next (Note that i+1 is passed, but
        // index is not changed)
        combinationUtil(arr, n, r, index, data, i + 1);
    }
 
    // The main function that prints all combinations
    // of size r in arr[] of size n. This function
    // mainly uses combinationUtil()
    static void printCombination(int arr[], int n, int r)
    {
        // A temporary array to store all combination
        // one by one
        int data[] = new int[r];
 
        // Print all combination using temprary
        // array 'data[]'
        combinationUtil(arr, n, r, 0, data, 0);
    }
 
    /* Driver function to check for above function */
    public static void main(String[] args)
    {
        int arr[] = { 10, 20, 30, 40, 50 };
        int r = 3;
        int n = arr.length;
        printCombination(arr, n, r);
    }
}
/* This code is contributed by Devesh Agrawal */


Python3
# Python3 program to print all
# subset combination of n
# element in given set of r element .
 
# arr[] ---> Input Array
# data[] ---> Temporary array to
#             store current combination
# start & end ---> Staring and Ending
#                  indexes in arr[]
# index ---> Current index in data[]
# r ---> Size of a combination
#        to be printed
def combinationUtil(arr, n, r,
                    index, data, i):
    # Current combination is
    # ready to be printed,
    # print it
    if(index == r):
        for j in range(r):
            print(data[j], end = " ")
        print(" ")
        return
 
    # When no more elements
    # are there to put in data[]
    if(i >= n):
        return
 
    # current is included,
    # put next at next
    # location
    data[index] = arr[i]
    combinationUtil(arr, n, r,
                    index + 1, data, i + 1)
     
    # current is excluded,
    # replace it with
    # next (Note that i+1
    # is passed, but index
    # is not changed)
    combinationUtil(arr, n, r, index,
                    data, i + 1)
 
 
# The main function that
# prints all combinations
# of size r in arr[] of
# size n. This function
# mainly uses combinationUtil()
def printcombination(arr, n, r):
 
    # A temporary array to
    # store all combination
    # one by one
    data = list(range(r))
     
    # Print all combination
    # using temporary
    # array 'data[]'
    combinationUtil(arr, n, r,
                    0, data, 0)
 
 
# Driver Code
arr = [10, 20, 30, 40, 50]
 
r = 3
n = len(arr)
printcombination(arr, n, r)
 
# This code is contributed
# by Ambuj sahu


C#
// C# program to print all combination
// of size r in an array of size n
using System;
 
class GFG {
 
    /* arr[] ---> Input Array
    data[] ---> Temporary array to store
    current combination start & end --->
    Staring and Ending indexes in arr[]
    index ---> Current index in data[]
    r ---> Size of a combination to be
    printed */
    static void combinationUtil(int []arr,
                  int n, int r, int index,
                          int []data, int i)
    {
         
        // Current combination is ready to
        // be printed, print it
        if (index == r)
        {
            for (int j = 0; j < r; j++)
                Console.Write(data[j] + " ");
                 
            Console.WriteLine("");
             
            return;
        }
 
        // When no more elements are there
        // to put in data[]
        if (i >= n)
            return;
 
        // current is included, put next
        // at next location
        data[index] = arr[i];
        combinationUtil(arr, n, r, index + 1,
                                data, i + 1);
 
        // current is excluded, replace
        // it with next (Note that i+1
        // is passed, but index is not
        // changed)
        combinationUtil(arr, n, r, index,
                                data, i + 1);
    }
 
    // The main function that prints all
    // combinations of size r in arr[] of
    // size n. This function mainly uses
    // combinationUtil()
    static void printCombination(int []arr,
                                int n, int r)
    {
         
        // A temporary array to store all
        // combination one by one
        int []data = new int[r];
 
        // Print all combination using
        // temprary array 'data[]'
        combinationUtil(arr, n, r, 0, data, 0);
    }
 
    /* Driver function to check for
    above function */
    public static void Main()
    {
        int []arr = { 10, 20, 30, 40, 50 };
        int r = 3;
        int n = arr.Length;
         
        printCombination(arr, n, r);
    }
}
 
// This code is contributed by vt_m.


PHP
 Input Array
n ---> Size of input array
r ---> Size of a combination to be printed
index ---> Current index in data[]
data[] ---> Temporary array to store
current combination
i ---> index of current element in arr[] */
function combinationUtil( $arr, $n, $r, $index,
                    $data, $i)
{
    // Current cobination is ready, print it
    if ($index == $r) {
        for ( $j = 0; $j < $r; $j++)
            echo $data[$j]," ";
        echo "\n";
        return;
    }
 
    // When no more elements are there to
    // put in data[]
    if ($i >= $n)
        return;
 
    // current is included, put next at
    // next location
    $data[$index] = $arr[$i];
    combinationUtil($arr, $n, $r, $index + 1,
                              $data, $i + 1);
 
    // current is excluded, replace it with
    // next (Note that i+1 is passed, but
    // index is not changed)
    combinationUtil($arr, $n, $r, $index,
                            $data, $i + 1);
}
 
// Driver program to test above functions
    $arr = array( 10, 20, 30, 40, 50 );
    $r = 3;
    $n = count($arr);
    printCombination($arr, $n, $r);
 
// This code is contributed by anuj_67.
?>


输出:

10 20 30 
10 20 40 
10 20 50 
10 30 40 
10 30 50 
10 40 50 
20 30 40 
20 30 50 
20 40 50 
30 40 50 

有关处理输入数组中重复项的更多解决方案和想法,请参考以下文章。
在大小为n的给定数组中打印r元素的所有可能组合。