Skip to content

Commit 922a1b6

Browse files
committed
feature: friends pairing problem sol added
1 parent 065de44 commit 922a1b6

File tree

5 files changed

+178
-1
lines changed

5 files changed

+178
-1
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#pragma once
2+
3+
#include<vector>
4+
using namespace std;
5+
6+
/*
7+
Pattern 1
8+
Linear Recurrence
9+
10+
Description
11+
Given n friends, each one can remain single or can be paired up with some other friend. Each friend can be paired only once. Find out the total number of ways in which friends can remain single or can be paired up.
12+
13+
Examples:
14+
15+
Input : n = 3
16+
Output : 4
17+
Explanation:
18+
{1}, {2}, {3} : all single
19+
{1}, {2, 3} : 2 and 3 paired but 1 is single.
20+
{1, 2}, {3} : 1 and 2 are paired but 3 is single.
21+
{1, 3}, {2} : 1 and 3 are paired but 2 is single.
22+
Note that {1, 2} and {2, 1} are considered same.
23+
24+
Mathematical Explanation:
25+
The problem is simplified version of how many ways we can divide n elements into multiple groups.
26+
(here group size will be max of 2 elements).
27+
In case of n = 3, we have only 2 ways to make a group:
28+
1) all elements are individual(1,1,1)
29+
2) a pair and individual (2,1)
30+
In case of n = 4, we have 3 ways to form a group:
31+
1) all elements are individual (1,1,1,1)
32+
2) 2 individuals and one pair (2,1,1)
33+
3) 2 separate pairs (2,2)
34+
*/
35+
36+
namespace FriendsPairingProblem
37+
{
38+
class DynamicProgramming
39+
{
40+
private:
41+
int CountFriendsPairingsRecursiveHelper(int n);
42+
public:
43+
int RecursiveCountFriendsPairings(int n);
44+
int DpCountFriendsPairings(int n);
45+
};
46+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#include "../../include/0005_DynamicProgramming/0009_FriendsPairingProblem.h"
2+
3+
namespace FriendsPairingProblem
4+
{
5+
// Dynamic Programming Private Member Methods.
6+
int DynamicProgramming::CountFriendsPairingsRecursiveHelper(int n)
7+
{
8+
if (n <= 1)
9+
{
10+
return 1;
11+
}
12+
int result = 0;
13+
result += this->CountFriendsPairingsRecursiveHelper(n - 1);
14+
result += (n - 1) * this->CountFriendsPairingsRecursiveHelper(n - 2);
15+
16+
return result;
17+
}
18+
19+
// Dynamic Programming Public Member Methods.
20+
int DynamicProgramming::RecursiveCountFriendsPairings(int n)
21+
{
22+
return this->CountFriendsPairingsRecursiveHelper(n);
23+
}
24+
25+
int DynamicProgramming::DpCountFriendsPairings(int n)
26+
{
27+
vector<int> dp(n + 1, 0);
28+
dp[0] = 0;
29+
dp[1] = 1;
30+
dp[2] = 2;
31+
32+
for (int i = 3; i <= n; i++)
33+
{
34+
dp[i] = dp[i - 1] + (i - 1) * dp[i - 2];
35+
}
36+
37+
return dp[n];
38+
}
39+
}

source/0005_DynamicProgramming/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ set(0005DYNAMICPROGRAMMING_SOURCES
88
0006_HouseRobber2.cc
99
0007_DecodeWays.cc
1010
0008_TilingProblem.cc
11-
11+
0009_FriendsPairingProblem.cc
1212
)
1313

1414
# Create a library target
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
#include <gtest/gtest.h>
2+
#include "../../include/0005_DynamicProgramming/0009_FriendsPairingProblem.h"
3+
4+
namespace FriendsPairingProblem
5+
{
6+
TEST(FriendsPairingProblemDynamicProgrammingTest, RecursiveCountFriendsPairingsTest1)
7+
{
8+
// Arrange
9+
DynamicProgramming dp;
10+
int numberOfFriends = 3;
11+
int expectedPairings = 4;
12+
13+
// Act
14+
int actualPairings = dp.RecursiveCountFriendsPairings(numberOfFriends);
15+
16+
// Assert
17+
ASSERT_EQ(expectedPairings, actualPairings);
18+
EXPECT_EQ(dp.RecursiveCountFriendsPairings(4), 10);
19+
EXPECT_EQ(dp.RecursiveCountFriendsPairings(5), 26);
20+
}
21+
22+
TEST(FriendsPairingProblemDynamicProgrammingTest, RecursiveCountFriendsPairingsTest2)
23+
{
24+
// Arrange
25+
DynamicProgramming dp;
26+
int numberOfFriends = 4;
27+
int expectedPairings = 10;
28+
29+
// Act
30+
int actualPairings = dp.RecursiveCountFriendsPairings(numberOfFriends);
31+
32+
// Assert
33+
ASSERT_EQ(expectedPairings, actualPairings);
34+
}
35+
36+
TEST(FriendsPairingProblemDynamicProgrammingTest, RecursiveCountFriendsPairingsTest3)
37+
{
38+
// Arrange
39+
DynamicProgramming dp;
40+
int numberOfFriends = 5;
41+
int expectedPairings = 26;
42+
43+
// Act
44+
int actualPairings = dp.RecursiveCountFriendsPairings(numberOfFriends);
45+
46+
// Assert
47+
ASSERT_EQ(expectedPairings, actualPairings);
48+
}
49+
50+
TEST(FriendsPairingProblemDynamicProgrammingTest, DpCountFriendsPairingsTest1)
51+
{
52+
// Arrange
53+
DynamicProgramming dp;
54+
int numberOfFriends = 3;
55+
int expectedPairings = 4;
56+
57+
// Act
58+
int actualPairings = dp.RecursiveCountFriendsPairings(numberOfFriends);
59+
60+
// Assert
61+
ASSERT_EQ(expectedPairings, actualPairings);
62+
}
63+
64+
TEST(FriendsPairingProblemDynamicProgrammingTest, DpCountFriendsPairingsTest2)
65+
{
66+
// Arrange
67+
DynamicProgramming dp;
68+
int numberOfFriends = 4;
69+
int expectedPairings = 10;
70+
71+
// Act
72+
int actualPairings = dp.RecursiveCountFriendsPairings(numberOfFriends);
73+
74+
// Assert
75+
ASSERT_EQ(expectedPairings, actualPairings);
76+
}
77+
78+
TEST(FriendsPairingProblemDynamicProgrammingTest, DpCountFriendsPairingsTest3)
79+
{
80+
// Arrange
81+
DynamicProgramming dp;
82+
int numberOfFriends = 5;
83+
int expectedPairings = 26;
84+
85+
// Act
86+
int actualPairings = dp.RecursiveCountFriendsPairings(numberOfFriends);
87+
88+
// Assert
89+
ASSERT_EQ(expectedPairings, actualPairings);
90+
}
91+
}

test/0005_DynamicProgramming/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ add_executable(
2222
0006_HouseRobber2Test.cc
2323
0007_DecodeWaysTest.cc
2424
0008_TilingProblemTest.cc
25+
0009_FriendsPairingProblemTest.cc
2526

2627
)
2728

0 commit comments

Comments
 (0)