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 = 3Output :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 = 2Output :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 <bits/stdc++.h>` `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

`<?php` `// PHP program to find number of ways` `// to pair people in party` `// Function to find number of ways to` `// pair people in party` `function` `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` `?>` |

## Javascript

`<script>` `// Javascript program to find number of ways to` `// pair people in party` `// Function to find number of ways to` `// pair people in party` `function` `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 code` `var` `p = 3;` `document.write( findWaysToPair(p));` `// This code is contributed by noob2000.` `</script>` |

**Output:**

4

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

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready. To complete your preparation from learning a language to DS Algo and many more, please refer **Complete Interview Preparation Course****.**

In case you wish to attend live classes with industry experts, please refer **DSA Live Classes**