Dados n amigos, cada uno puede permanecer soltero o emparejarse con algún otro amigo. Cada amigo puede emparejarse solo una vez. Averigüe el número total de formas en que los amigos pueden permanecer solteros o formar parejas.
Ejemplos:
Input : n = 3 Output : 4 Explanation: {1}, {2}, {3} : all single {1}, {2, 3} : 2 and 3 paired but 1 is single. {1, 2}, {3} : 1 and 2 are paired but 3 is single. {1, 3}, {2} : 1 and 3 are paired but 2 is single. Note that {1, 2} and {2, 1} are considered same. Mathematical Explanation: The problem is simplified version of how many ways we can divide n elements into multiple groups. (here group size will be max of 2 elements). In case of n = 3, we have only 2 ways to make a group: 1) all elements are individual(1,1,1) 2) a pair and individual (2,1) In case of n = 4, we have 3 ways to form a group: 1) all elements are individual (1,1,1,1) 2) 2 individuals and one pair (2,1,1) 3) 2 separate pairs (2,2)
o emparejarse. Para la n-ésima persona hay dos opciones: 1) la n-ésima persona permanece soltera, recurrimos para f(n – 1) 2) la n-ésima persona se empareja con cualquiera de las n – 1 personas restantes. Obtenemos (n – 1) * f (n – 2) Por lo tanto, podemos escribir recursivamente f (n) como: f (n) = f (n – 1) + (n – 1) * f (n – 2)
Dado que la fórmula recursiva anterior tiene subproblemas superpuestos , podemos resolverlo usando Programación Dinámica.
C++
// C++ program for solution of // friends pairing problem #include <bits/stdc++.h> using namespace std; // Returns count of ways n people // can remain single or paired up. int countFriendsPairings(int n) { int dp[n + 1]; // Filling dp[] in bottom-up manner using // recursive formula explained above. for (int i = 0; i <= n; i++) { if (i <= 2) dp[i] = i; else dp[i] = dp[i - 1] + (i - 1) * dp[i - 2]; } return dp[n]; } // Driver code int main() { int n = 4; cout << countFriendsPairings(n) << endl; return 0; }
Java
// Java program for solution of // friends pairing problem import java.io.*; class GFG { // Returns count of ways n people // can remain single or paired up. static int countFriendsPairings(int n) { int dp[] = new int[n + 1]; // Filling dp[] in bottom-up manner using // recursive formula explained above. for (int i = 0; i <= n; i++) { if (i <= 2) dp[i] = i; else dp[i] = dp[i - 1] + (i - 1) * dp[i - 2]; } return dp[n]; } // Driver code public static void main(String[] args) { int n = 4; System.out.println(countFriendsPairings(n)); } } // This code is contributed by vt_m
Python3
# Python program solution of # friends pairing problem # Returns count of ways # n people can remain # single or paired up. def countFriendsPairings(n): dp = [0 for i in range(n + 1)] # Filling dp[] in bottom-up manner using # recursive formula explained above. for i in range(n + 1): if(i <= 2): dp[i] = i else: dp[i] = dp[i - 1] + (i - 1) * dp[i - 2] return dp[n] # Driver code n = 4 print(countFriendsPairings(n)) # This code is contributed # by Soumen Ghosh.
C#
// C# program solution for // friends pairing problem using System; class GFG { // Returns count of ways n people // can remain single or paired up. static int countFriendsPairings(int n) { int[] dp = new int[n + 1]; // Filling dp[] in bottom-up manner using // recursive formula explained above. for (int i = 0; i <= n; i++) { if (i <= 2) dp[i] = i; else dp[i] = dp[i - 1] + (i - 1) * dp[i - 2]; } return dp[n]; } // Driver code public static void Main() { int n = 4; Console.Write(countFriendsPairings(n)); } } // This code is contributed by nitin mittal.
PHP
<?php // PHP program solution for // friends pairing problem // Returns count of ways n people // can remain single or paired up. function countFriendsPairings($n) { $dp[$n + 1] = 0; // Filling dp[] in bottom-up // manner using recursive formula // explained above. for ($i = 0; $i <= $n; $i++) { if ($i <= 2) $dp[$i] = $i; else $dp[$i] = $dp[$i - 1] + ($i - 1) * $dp[$i - 2]; } return $dp[$n]; } // Driver code $n = 4; echo countFriendsPairings($n) ; // This code is contributed // by nitin mittal. ?>
Javascript
<script> // Javascript program for solution of // friends pairing problem // Returns count of ways n people // can remain single or paired up. function countFriendsPairings(n) { let dp = []; // Filling dp[] in bottom-up manner using // recursive formula explained above. for (let i = 0; i <= n; i++) { if (i <= 2) dp[i] = i; else dp[i] = dp[i - 1] + (i - 1) * dp[i - 2]; } return dp[n]; } // Driver Code let n = 4; document.write(countFriendsPairings(n)); </script>
Producción:
10
Complejidad de tiempo: O(n)
Espacio auxiliar: O(n)
Otro enfoque: (usando la recursividad)
C++
// C++ program for solution of friends // pairing problem Using Recursion #include <bits/stdc++.h> using namespace std; int dp[1000]; // Returns count of ways n people // can remain single or paired up. int countFriendsPairings(int n) { if (dp[n] != -1) return dp[n]; if (n > 2) return dp[n] = countFriendsPairings(n - 1) + (n - 1) * countFriendsPairings(n - 2); else return dp[n] = n; } // Driver code int main() { memset(dp, -1, sizeof(dp)); int n = 4; cout << countFriendsPairings(n) << endl; // this code is contributed by Kushdeep Mittal }
Java
// Java program for solution of friends // pairing problem Using Recursion class GFG { static int[] dp = new int[1000]; // Returns count of ways n people // can remain single or paired up. static int countFriendsPairings(int n) { if (dp[n] != -1) return dp[n]; if (n > 2) return dp[n] = countFriendsPairings(n - 1) + (n - 1) * countFriendsPairings(n - 2); else return dp[n] = n; } // Driver code public static void main(String[] args) { for (int i = 0; i < 1000; i++) dp[i] = -1; int n = 4; System.out.println(countFriendsPairings(n)); } } // This code is contributed by Ita_c.
Python3
# Python3 program for solution of friends # pairing problem Using Recursion dp = [-1] * 1000 # Returns count of ways n people # can remain single or paired up. def countFriendsPairings(n): global dp if(dp[n] != -1): return dp[n] if(n > 2): dp[n] = (countFriendsPairings(n - 1) + (n - 1) * countFriendsPairings(n - 2)) return dp[n] else: dp[n] = n return dp[n] # Driver Code n = 4 print(countFriendsPairings(n)) # This code contributed by PrinciRaj1992
C#
// C# program for solution of friends // pairing problem Using Recursion using System; class GFG { static int[] dp = new int[1000]; // Returns count of ways n people // can remain single or paired up. static int countFriendsPairings(int n) { if (dp[n] != -1) return dp[n]; if (n > 2) return dp[n] = countFriendsPairings(n - 1) + (n - 1) * countFriendsPairings(n - 2); else return dp[n] = n; } // Driver code static void Main() { for (int i = 0; i < 1000; i++) dp[i] = -1; int n = 4; Console.Write(countFriendsPairings(n)); } } // This code is contributed by DrRoot_
PHP
<?php // PHP program for solution of friends // pairing problem Using Recursion // Returns count of ways n people // can remain single or paired up. function countFriendsPairings($n) { $dp = array_fill(0, 1000, -1); if($dp[$n] != -1) return $dp[$n]; if($n > 2) { $dp[$n] = countFriendsPairings($n - 1) + ($n - 1) * countFriendsPairings($n - 2); return $dp[$n]; } else { $dp[$n] = $n; return $dp[$n]; } } // Driver Code $n = 4; echo countFriendsPairings($n) // This code is contributed by Ryuga ?>
Javascript
<script> // Javascript program for solution of friends // pairing problem Using Recursion let dp = new Array(1000); // Returns count of ways n people // can remain single or paired up. function countFriendsPairings(n) { if (dp[n] != -1) return dp[n]; if (n > 2) return dp[n] = countFriendsPairings(n - 1) + (n - 1) * countFriendsPairings(n - 2); else return dp[n] = n; } // Driver code for (let i = 0; i < 1000; i++) dp[i] = -1; let n = 4; document.write(countFriendsPairings(n)); // This code is contributed by rag2127 </script>
Producción:
10
Complejidad de tiempo: O(n)
Espacio auxiliar: O(n)
Dado que la fórmula anterior es similar al número de Fibonacci , podemos optimizar el espacio con una solución iterativa.
C++
#include <bits/stdc++.h> using namespace std; // Returns count of ways n people // can remain single or paired up. int countFriendsPairings(int n) { int a = 1, b = 2, c = 0; if (n <= 2) { return n; } for (int i = 3; i <= n; i++) { c = b + (i - 1) * a; a = b; b = c; } return c; } // Driver code int main() { int n = 4; cout << countFriendsPairings(n); return 0; } // This code is contributed by mits
Java
class GFG { // Returns count of ways n people // can remain single or paired up. static int countFriendsPairings(int n) { int a = 1, b = 2, c = 0; if (n <= 2) { return n; } for (int i = 3; i <= n; i++) { c = b + (i - 1) * a; a = b; b = c; } return c; } // Driver code public static void main(String[] args) { int n = 4; System.out.println(countFriendsPairings(n)); } } // This code is contributed by Ravi Kasha.
Python3
# Returns count of ways n people # can remain single or paired up. def countFriendsPairings(n): a, b, c = 1, 2, 0; if (n <= 2): return n; for i in range(3, n + 1): c = b + (i - 1) * a; a = b; b = c; return c; # Driver code n = 4; print(countFriendsPairings(n)); # This code contributed by Rajput-Ji
C#
using System; class GFG { // Returns count of ways n people // can remain single or paired up. static int countFriendsPairings(int n) { int a = 1, b = 2, c = 0; if (n <= 2) { return n; } for (int i = 3; i <= n; i++) { c = b + (i - 1) * a; a = b; b = c; } return c; } // Driver code public static void Main(String[] args) { int n = 4; Console.WriteLine(countFriendsPairings(n)); } } // This code has been contributed by 29AjayKumar
PHP
<?php // Returns count of ways n people // can remain single or paired up. function countFriendsPairings($n) { $a = 1; $b = 2; $c = 0; if ($n <= 2) { return $n; } for ($i = 3; $i <= $n; $i++) { $c = $b + ($i - 1) * $a; $a = $b; $b = $c; } return $c; } // Driver code $n = 4; print(countFriendsPairings($n)); // This code is contributed by mits ?>
Javascript
<script> // Returns count of ways n people // can remain single or paired up. function countFriendsPairings(n) { let a = 1, b = 2, c = 0; if (n <= 2) { return n; } for (let i = 3; i <= n; i++) { c = b + (i - 1) * a; a = b; b = c; } return c; } // Driver code let n = 4; document.write(countFriendsPairings(n)); // This code is contributed by avanitrachhadiya2155 </script>
Producción:
10
Tiempo Complejidad : O(n)
Espacio Auxiliar : O(1)
Otro enfoque: dado que podemos resolver el problema anterior usando matemáticas, la solución a continuación se realiza sin usar programación dinámica.
C++
// C++ soln using mathematical approach #include <bits/stdc++.h> using namespace std; void preComputeFact(vector<long long int>& fact, int n) { for(int i = 1; i <= n; i++) fact.push_back(fact[i - 1] * i); } // Returns count of ways n people // can remain single or paired up. int countFriendsPairings(vector<long long int> fact, int n) { int ones = n, twos = 1, ans = 0; while (ones >= 0) { // pow of 1 will always be one ans += fact[n] / (twos * fact[ones] * fact[(n - ones) / 2]); ones -= 2; twos *= 2; } return ans; } // Driver code int main() { vector<long long int> fact; fact.push_back(1); preComputeFact(fact, 100); int n = 4; cout << countFriendsPairings(fact, n) << endl; return 0; } // This code is contributed by rajsanghavi9.
Java
// Java soln using mathematical approach import java.util.*; class GFG{ static Vector<Integer> fact; static void preComputeFact( int n) { for(int i = 1; i <= n; i++) fact.add(fact.elementAt(i - 1) * i); } // Returns count of ways n people // can remain single or paired up. static int countFriendsPairings(int n) { int ones = n, twos = 1, ans = 0; while (ones >= 0) { // pow of 1 will always be one ans += fact.elementAt(n) / (twos * fact.elementAt(ones) * fact.elementAt((n - ones) / 2)); ones -= 2; twos *= 2; } return ans; } // Driver code public static void main(String[] args) { fact = new Vector<>(); fact.add(1); preComputeFact(100); int n = 4; System.out.print(countFriendsPairings(n) +"\n"); } } // This code is contributed by umadevi9616
Python3
# Python3 soln using mathematical approach # factorial array is stored dynamically fact = [1] def preComputeFact(n): for i in range(1, n+1): fact.append((fact[i-1]*i)) # Returns count of ways n people # can remain single or paired up. def countFriendsPairings(n): ones = n twos = 1 ans = 0 while(ones >= 0): # pow of 1 will always be one ans = ans + (fact[n]//(twos*fact[ones]*fact[(n-ones)//2])) ones = ones - 2 twos = twos * 2 return(ans) # Driver Code # pre-compute factorial preComputeFact(1000) n = 4 print(countFriendsPairings(n)) # solution contributed by adarsh_007
C#
// C# program to implement the approach using System; using System.Collections.Generic; public class GFG { // initializing the fact list static List<int> fact = new List<int>(); // computing the next n values of fact static void preComputeFact(int n) { for (int i = 1; i <= n; i++) { fact.Add(fact[i - 1] * i); } } // Returns count of ways n people // can remain single or paired up. static int countFriendsPairings(int n) { int ones = n; int twos = 1; int ans = 0; while (ones >= 0) { // pow of 1 will always be one ans += fact[n] / (twos * fact[ones] * fact[(n - ones) / 2]); ones -= 2; twos *= 2; } return ans; } // driver code static public void Main() { // initializing the first element of fact fact.Add(1); preComputeFact(100); int n = 4; Console.Write(countFriendsPairings(n)); } } // this code is contributed by phasing17
Javascript
<script> // Javascript soln using mathematical approach // factorial array is stored dynamically let fact = [1]; function preComputeFact(n) { for(let i=1;i<n+1;i++) { fact.push((fact[i-1]*i)); } } // Returns count of ways n people // can remain single or paired up. function countFriendsPairings(n) { let ones = n let twos = 1; let ans = 0; while(ones >= 0) { // pow of 1 will always be one ans = ans + Math.floor(fact[n]/(twos*fact[ones]* fact[(n-ones)/2])) ones = ones - 2 twos = twos * 2 } return ans; } // Driver Code // pre-compute factorial preComputeFact(1000) n = 4 document.write(countFriendsPairings(n)) // This code is contributed by ab2127 </script>
Producción:
10
Complejidad temporal: O(n)
Espacio auxiliar: O(n)
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA