好友配对问题
在一个群组里有 n个朋友。每个人可以保持单身状态,或与其他某个朋友配对。求出朋友们可以保持单身或配对的总数。
如果一对由两个朋友 p 和 q 组成,则 (p, q) 或 (q, p) 相同。
对于一组 n个朋友,设 f(n) 是他们可以配对或保持单身的方式数。则第 n 个人可以保持单身,或配对。如果第 n 个人保持单身,则我们递归 (n - 1) 个朋友。如果第 n 个人与剩下的 (n-1) 个朋友中的任何一个配对,则我们递归 (n-1) * f(n-2)。
输出和输入
Input: The number of friends. Say 5. Output: The possible way to pair them. Here the answer is 26.
算法
countPairs(n)
输入:朋友数。
输出:将 n 个朋友配对的方式数。
Begin define pair array of size n + 1 pair[0] := 0, pair[1] := 1 and pair[2] := 2 for i in range 3 to n, do pair[i] := pair[i-1] + (i+1)*pairs[i-2] done pair[n] End
示例
#include <iostream> using namespace std; int countPairs(int n) { int pairs[n + 1]; //number of pairs for ith number //for number 0 to 2, there are 0 to 2 possible combination pairs[0] = 0; pairs[1] = 1; pairs[2] = 2; for (int i = 3; i <= n; i++) //fill array for 3 to n numbers pairs[i] = pairs[i-1] + (i-1) * pairs[i-2]; return pairs[n]; } int main() { int n; cout << "Enter numbers: "; cin >> n; cout << "Number of ways to pair "<<n<<" friends: " << countPairs(n); }
输出
Enter numbers: 5 Number of ways to pair 5 friends: 26
广告