# Number of ways to pair people

• Difficulty Level : Medium
• Last Updated : 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++

 `// CPP program to find number of ways to``// pair people in party` `#include ``using` `namespace` `std;` `// Function to find number of ways to``// pair people in party``int` `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 code``int` `main()``{``    ``int` `p = 3;``    ``cout << findWaysToPair(p);``    ``return` `0;``}`

## Java

 `// Java program to find number of ways to``// pair people in party` `class` `GFG``{``    ` `// Function to find number of ways to``// pair people in party``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 code``public` `static` `void` `main(String args[])``{``    ``int` `p = ``3``;``    ``System.out.println(findWaysToPair(p));``}``}` `// This code is contributed by Arnab Kundu`

## Python3

 `# Python3 program to find number of``# ways to pair people in party` `# Function to find number of ways``# to pair people in party``def` `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 code``p ``=` `3``print``(findWays(p))` `# This code is contributed by Shrikant13`

## C#

 `// C# program to find number of ways to``// pair people in party``using` `System;` `class` `GFG``{` `// Function to find number of ways to``// pair people in party``public` `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 code``public` `static` `void` `Main(``string``[] args)``{``    ``int` `p = 3;``    ``Console.WriteLine(findWaysToPair(p));``}``}` `// This code is contributed by shrikanth13`

## PHP

 ``

## Javascript

 ``

Output:

`4`

Time Complexity: O(p)
Auxiliary Space: O(p)

My Personal Notes arrow_drop_up