logo

Problemer med venneparing

Gitt n venner kan hver og en forbli singel eller kan pares med en annen venn. Hver venn kan kun pares én gang. Finn ut det totale antallet måter som venner kan forbli singel eller kan kobles sammen. 

Eksempler:  

  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(111) 2) a pair and individual (21) In case of n = 4 we have 3 ways to form a group: 1) all elements are individual (1111) 2) 2 individuals and one pair (211) 3) 2 separate pairs (22)

tinytextbf{Matematisk formel:} nylinje{frac{n!}{((g_1!)^xtimes (g_2!)^ytimes ... (g_n!)^z)times(x!times y!times...z!)}}spacespace-tinytext{ ----- (1)} newline{tinytext{hvis samme gruppestørrelse skal gjentas med tid på svaret vårt x!y!...z!}} nylinje{tinytext{nå kan vi vurdere vårt tilfelle n=3 og gruppestørrelse maks. størrelse 2 og min størrelse 1:}} newline{frac{3!}{(1!)^3times(3!)} space+space frac{3!}{(2!)^1times(1!)^1times(1!)^1times(1!)nows" n=4:}} nylinje{frac{4!}{(1!)^4ganger(4!)} mellomrom+frac{4!}{(2!)^1ganger(1!)^2ganger(2!)}mellomrom + mellomromsbrøk{4!}{(2!)^2 ganger(2!)}mellomrom = 10}



Anbefalt praksis Problemer med venneparing Prøv det!

For n-te person er det to valg: 1) n-te person forblir singel vi gjentar for f(n - 1)2) n-te person parer seg med noen av de resterende n - 1 personene. Vi får (n - 1) * f(n - 2)Derfor kan vi rekursivt skrive f(n) som:f(n) = f(n - 1) + (n - 1) * f(n - 2)

Siden den ovennevnte rekursive formelen har overlappende delproblemer vi kan løse det ved hjelp av dynamisk programmering.  

C++
// C++ program for solution of // friends pairing problem #include    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 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> 

Produksjon
10 

Tidskompleksitet: På) 
Hjelpeplass: På)

En annen tilnærming: (Bruker rekursjon)  

C++
// C++ program for solution of friends // pairing problem Using Recursion #include    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 import java.io.*; 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 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>  

Produksjon
10 

Tidskompleksitet: På) 
Hjelpeplass: På)

Siden formelen ovenfor ligner på fibonacci nummer vi kan optimere plassen med en iterativ løsning.  

C++
#include    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
import java.io.*; 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
 // 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> 

Produksjon
10

Tidskompleksitet: På) 
Hjelpeplass: O(1)

En annen tilnærming: Siden vi kan løse problemet ovenfor ved hjelp av matematikk, er løsningen nedenfor gjort uten å bruke dynamisk programmering.

C++
// C++ soln using mathematical approach #include    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> 

Produksjon
10 

Tidskompleksitet:  På) 
Hjelpeplass: På)

Lag quiz