Ways of selecting men and women from a group to make a team - GeeksforGeeks

22 Mar, 2021
Given four integers n, w, m and k where,  
m is the total number of men.
w is the total number of women.
n is the total number of people that need to be selected to form the team.
k is the minimum number of men that have to be selected.
The task is to find the number of ways in which the team can be formed.Examples:  
Input: m = 2, w = 2, n = 3, k = 1 Output: 4 There are 2 men, 2 women. We need to make a team of size 3 with at least one man and one woman. We can make the team in following ways. m1 m2 w1 m1 w1 w2 m2 w1 w2 m1 m2 w2Input: m = 7, w = 6, n = 5, k = 3 Output: 756Input: m = 5, w = 6, n = 6, k = 3 Output: 281  
 
Approach: Since, we have to take at least k men.  
Totals ways = Ways when ‘k’ men are selected + Ways when ‘k+1’ men are selected + ... + when ‘n’ men are selected
. Taking the first example from above where out of 7 men and 6 women, total 5 people need to be selected with at least 3 men, Number of ways = (7C3 x 6C2) + (7C4 x 6C1) + (7C5) = 7 x 6 x 5 x 6 x 5 + (7C3 x 6C1) + (7C2) = 525 + 7 x 6 x 5 x 6 + 7 x 6 = (525 + 210 + 21) = 756Below is the implementation of the above approach:  
C++
Java
Python3
C#
PHP
Javascript
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std; // Returns factorial// of the numberint fact(int n){    int fact = 1;    for (int i = 2; i <= n; i++)        fact *= i;    return fact;} // Function to calculate ncrint ncr(int n, int r){    int ncr = fact(n) / (fact(r) * fact(n - r));    return ncr;} // Function to calculate// the total possible waysint ways(int m, int w, int n, int k){     int ans = 0;    while (m >= k) {        ans += ncr(m, k) * ncr(w, n - k);        k += 1;    }     return ans;} // Driver codeint main(){     int m, w, n, k;    m = 7;    w = 6;    n = 5;    k = 3;    cout << ways(m, w, n, k);}
// Java implementation of the approach import java.io.*; class GFG { // Returns factorial// of the numberstatic int fact(int n){    int fact = 1;    for (int i = 2; i <= n; i++)        fact *= i;    return fact;} // Function to calculate ncrstatic int ncr(int n, int r){    int ncr = fact(n) / (fact(r) * fact(n - r));    return ncr;} // Function to calculate// the total possible waysstatic int ways(int m, int w, int n, int k){     int ans = 0;    while (m >= k) {        ans += ncr(m, k) * ncr(w, n - k);        k += 1;    }     return ans;} // Driver code    public static void main (String[] args) {             int m, w, n, k;    m = 7;    w = 6;    n = 5;    k = 3;    System.out.println( ways(m, w, n, k));    }}// This Code is contributed// by shs
# Python 3 implementation of the approach # Returns factorial of the numberdef fact(n):    fact = 1    for i in range(2, n + 1):        fact *= i    return fact # Function to calculate ncrdef ncr(n, r):    ncr = fact(n) // (fact(r) * fact(n - r))    return ncr # Function to calculate# the total possible waysdef ways(m, w, n, k):    ans = 0    while (m >= k):        ans += ncr(m, k) * ncr(w, n - k)        k += 1     return ans; # Driver codem = 7w = 6n = 5k = 3print(ways(m, w, n, k)) # This code is contributed by sahishelangia
// C# implementation of the approach class GFG { // Returns factorial// of the numberstatic int fact(int n){    int fact = 1;    for (int i = 2; i <= n; i++)        fact *= i;    return fact;} // Function to calculate ncrstatic int ncr(int n, int r){    int ncr = fact(n) / (fact(r) * fact(n - r));    return ncr;} // Function to calculate// the total possible waysstatic int ways(int m, int w, int n, int k){     int ans = 0;    while (m >= k) {        ans += ncr(m, k) * ncr(w, n - k);        k += 1;    }     return ans;} // Driver code    static void Main () {             int m, w, n, k;    m = 7;    w = 6;    n = 5;    k = 3;    System.Console.WriteLine( ways(m, w, n, k));    }}// This Code is contributed by mits
<?php// PHP implementation of the approach // Returns factorial of the numberfunction fact($n){    $fact = 1;    for ($i = 2; $i <= $n; $i++)        $fact *= $i;    return $fact;} // Function to calculate ncrfunction ncr($n, $r){    $ncr = (int)(fact($n) / (fact($r) *                 fact($n - $r)));    return $ncr;} // Function to calculate the total// possible waysfunction ways($m, $w, $n, $k){    $ans = 0;    while ($m >= $k)    {        $ans += ncr($m, $k) *                ncr($w, $n - $k);        $k += 1;    }     return $ans;} // Driver code$m = 7;$w = 6;$n = 5;$k = 3;echo ways($m, $w, $n, $k); // This Code is contributed// by Mukul Singh
<script>// javascript implementation of the approach // Returns factorial// of the numberfunction fact(n){    var fact = 1;    for (i = 2; i <= n; i++)        fact *= i;    return fact;} // Function to calculate ncrfunction ncr(n , r){    var ncr = fact(n) / (fact(r) * fact(n - r));    return parseInt(ncr);} // Function to calculate// the total possible waysfunction ways(m , w , n , k){     var ans = 0;    while (m >= k)    {        ans += ncr(m, k) * ncr(w, n - k);        k += 1;    }     return parseInt(ans);} // Driver codevar m, w, n, k;m = 7;w = 6;n = 5;k = 3;document.write( ways(m, w, n, k)); // This code is contributed by 29AjayKumar.</script>
756
 
Further Optimization : The above code can be optimized using faster algorithms for binomial coefficient computation. 
Shashank12
Mithun Kumar
sahilshelangia
Code_Mech
29AjayKumar
binomial coefficient
Combinatorial
Mathematical
Mathematical
Combinatorial
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Combinational Sum
Count ways to reach the nth stair using step 1, 2 or 3
Print all possible strings of length k that can be formed from a set of n characters
Count of subsets with sum equal to X
Python program to get all subsets of given size of a set
Program for Fibonacci numbers
C++ Data Types
Set in C++ Standard Template Library (STL)
Coin Change | DP-7
Merge two sorted arrays