Са н пријатеља сваки може остати самац или може бити упарен са неким другим пријатељем. Сваки пријатељ може бити упарен само једном. Сазнајте укупан број начина на које пријатељи могу остати самци или могу бити упарени.
Примери:
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) тинитектбф{Математичка формула:} нови ред{фрац{н!}{((г_1!)^ктимес (г_2!)^итимес ... (г_н!)^з)тимес(к!тимес и!тимес...з!)}}спацетинитект{ ----- (1)} нови ред{тинитект{ако имамо исту величину групе за дељење по времену к!и!...з!}} нови ред{тинитект{сада размотримо наш случај н=3 и максималну величину групе величине 2 и минималне величине 1:}} нови ред{фрац{3!}{(1!)^3пута(3!)} размак+размак фрац{3!}{(2!)^1пут(1!)^1пута размак(1!)^1пут размак(1!)^1пут размак(1!)4}в размотримо наш случај{1! н=4:}} нови ред{фрац{4!}{(1!)^4пута(4!)} размак+ фрац{4!}{(2!)^1пут(1!)^2пут(2!)}размак + размак размак{4!}{(2!)^2пута(2!)}размак = 10}
Препоручена пракса Проблем упаривања пријатеља Покушајте!
За н-ту особу постоје два избора: 1) н-та особа остаје сама, понављамо за ф(н - 1)2) н-та особа се упарује са било којом од преосталих н - 1 особа. Добијамо (н - 1) * ф(н - 2) Због тога можемо рекурзивно написати ф(н) као: ф(н) = ф(н - 1) + (н - 1) * ф(н - 2)
Пошто горња рекурзивна формула има подпроблеми који се преклапају можемо га решити помоћу динамичког програмирања.
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>
Излаз
10
Временска сложеност: О(н)
Помоћни простор: О(н)
Други приступ: (Користећи рекурзију)
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>
Излаз
10
Временска сложеност: О(н)
Помоћни простор: О(н)
Пошто је горња формула слична фибоначијев број можемо оптимизовати простор итеративним решењем.
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>
Излаз
10
Временска сложеност: О(н)
Помоћни простор: О(1)
Други приступ: Пошто можемо да решимо горњи проблем помоћу математике, решење испод се ради без коришћења динамичког програмирања.
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>
Излаз
10
Временска сложеност: О(н)
Помоћни простор: О(н)