Number of ways to pair people

21 Apr, 2021
Given that there are p people in a party. Each person can either join dance as a single individual or as a pair with any other. The task is to find the number of different ways in which p people can join the dance.Examples:  
Input : p = 3
Output : 4
Let the three people be P1, P2 and P3
Different ways are: {P1, P2, P3}, {{P1, P2}, P3},
{{P1, P3}, P2} and {{P2, P3}, P1}.

Input : p = 2
Output : 2
The groups are: {P1, P2} and {{P1, P2}}.
 
Approach: The idea is to use dynamic programming to solve this problem. There are two situations: Either the person join dance as single individual or as a pair. For the first case the problem reduces to finding the solution for p-1 people. For the second case, there are p-1 choices to select an individual for pairing and after selecting an individual for pairing the problem reduces to finding solution for p-2 people as two people among p are already paired. So the formula for dp is:  
dp[p] = dp[p-1] + (p-1) * dp[p-2].
Below is the implementation of the above approach:  
C++
Java
Python3
C#
PHP
Javascript
// CPP program to find number of ways to// pair people in party #include <bits/stdc++.h>using namespace std; // Function to find number of ways to// pair people in partyint findWaysToPair(int p){    // To store count of number of ways.    int dp[p + 1];     dp[1] = 1;    dp[2] = 2;     // Using the recurrence defined find    // count for different values of p.    for (int i = 3; i <= p; i++) {        dp[i] = dp[i - 1] + (i - 1) * dp[i - 2];    }     return dp[p];} // Driver codeint main(){    int p = 3;    cout << findWaysToPair(p);    return 0;}
// Java program to find number of ways to// pair people in party class GFG{     // Function to find number of ways to// pair people in partystatic int findWaysToPair(int p){    // To store count of number of ways.    int dp[] = new int[p + 1];     dp[1] = 1;    dp[2] = 2;     // Using the recurrence defined find    // count for different values of p.    for (int i = 3; i <= p; i++)    {        dp[i] = dp[i - 1] + (i - 1) * dp[i - 2];    }     return dp[p];} // Driver codepublic static void main(String args[]){    int p = 3;    System.out.println(findWaysToPair(p));}} // This code is contributed by Arnab Kundu
# Python3 program to find number of# ways to pair people in party # Function to find number of ways# to pair people in partydef findWays(p):     # To store count of number of ways.    dp = [0] * (p + 1)    dp[1] = 1    dp[2] = 2     # Using the recurrence defined find    # count for different values of p.    for i in range(3, p + 1):        dp[i] = (dp[i - 1] +                   (i - 1) * dp[i - 2])    return dp[p] # Driver codep = 3print(findWays(p)) # This code is contributed by Shrikant13
// C# program to find number of ways to// pair people in partyusing System; class GFG{ // Function to find number of ways to// pair people in partypublic static int findWaysToPair(int p){    // To store count of number of ways.    int[] dp = new int[p + 1];     dp[1] = 1;    dp[2] = 2;     // Using the recurrence defined find    // count for different values of p.    for (int i = 3; i <= p; i++)    {        dp[i] = dp[i - 1] + (i - 1) * dp[i - 2];    }    return dp[p];} // Driver codepublic static void Main(string[] args){    int p = 3;    Console.WriteLine(findWaysToPair(p));}} // This code is contributed by shrikanth13
<?php// PHP program to find number of ways// to pair people in party // Function to find number of ways to// pair people in partyfunction findWaysToPair($p){    // To store count of number of ways.    $dp = array();     $dp[1] = 1;    $dp[2] = 2;     // Using the recurrence defined find    // count for different values of p.    for ($i = 3; $i <= $p; $i++)    {        $dp[$i] = $dp[$i - 1] +                     ($i - 1) * $dp[$i - 2];    }     return $dp[$p];} // Driver code$p = 3;echo findWaysToPair($p); // This code is contributed// by Akanksha Rai?>
<script>// Javascript program to find number of ways to// pair people in party // Function to find number of ways to// pair people in partyfunction findWaysToPair(p){    // To store count of number of ways.    var dp = Array(p+1);     dp[1] = 1;    dp[2] = 2;     // Using the recurrence defined find    // count for different values of p.    for (var i = 3; i <= p; i++) {        dp[i] = dp[i - 1] + (i - 1) * dp[i - 2];    }     return dp[p];} // Driver codevar p = 3;document.write( findWaysToPair(p)); // This code is contributed by noob2000.</script>
4
 
Time Complexity: O(p) Auxiliary Space: O(p) 
andrew1234
shrikanth13
Akanksha_Rai
noob2000
Algorithms
Combinatorial
Dynamic Programming
Dynamic Programming
Combinatorial
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.