Time complexity of Bit mask












0














Basically I was trying to calculate the time complexity of below solution ,I took this problem from Bit masking cap problem (same question with better explanation bit mask problem)and understand it very well But unable to calculate the time complexity as recursion is going inside loop
Even my professor didn't get this how to do it?



BIT MASKING



There are 100 different types of caps each having a unique id from 1 to 100. Also, there are ‘n’ persons each having a collection of a variable number of caps. One day all of these persons decide to go in a party wearing a cap but to look unique they decided that none of them will wear the same type of cap. So, count the total number of arrangements or ways such that none of them is wearing the same type of cap.



Constraints: 1 <= n <= 10 Example:



    // C++ program to find number of ways to wear hats 
#include<bits/stdc++.h>
#define MOD 1000000007
using namespace std;

// capList[i]'th vector contains the list of persons having a cap with id i
// id is between 1 to 100 so we declared an array of 101 vectors as indexing
// starts from 0.
vector<int> capList[101];

// dp[2^10][101] .. in dp[i][j], i denotes the mask i.e., it tells that
// how many and which persons are wearing cap. j denotes the first j caps
// used. So, dp[i][j] tells the number ways we assign j caps to mask i
// such that none of them wears the same cap
int dp[1025][101];

// This is used for base case, it has all the N bits set
// so, it tells whether all N persons are wearing a cap.
int allmask;

// Mask is the set of persons, i is cap-id (OR the
// number of caps processed starting from first cap).
long long int countWaysUtil(int mask, int i)
{
// If all persons are wearing a cap so we
// are done and this is one way so return 1
if (mask == allmask) return 1;

// If not everyone is wearing a cap and also there are no more
// caps left to process, so there is no way, thus return 0;
if (i > 100) return 0;

// If we already have solved this subproblem, return the answer.
if (dp[mask][i] != -1) return dp[mask][i];

// Ways, when we don't include this cap in our arrangement
// or solution set.
long long int ways = countWaysUtil(mask, i+1);

// size is the total number of persons having cap with id i.
int size = capList[i].size();

// So, assign one by one ith cap to all the possible persons
// and recur for remaining caps.
for (int j = 0; j < size; j++)
{
// if person capList[i][j] is already wearing a cap so continue as
// we cannot assign him this cap
if (mask & (1 << capList[i][j])) continue;

// Else assign him this cap and recur for remaining caps with
// new updated mask vector
else ways += countWaysUtil(mask | (1 << capList[i][j]), i+1);
ways %= MOD;
}

// Save the result and return it.
return dp[mask][i] = ways;
}

// Reads n lines from standard input for current test case
void countWays(int n)
{
//----------- READ INPUT --------------------------
string temp, str;
int x;
getline(cin, str); // to get rid of newline character
for (int i=0; i<n; i++)
{
getline(cin, str);
stringstream ss(str);

// while there are words in the streamobject ss
while (ss >> temp)
{
stringstream s;
s << temp;
s >> x;

// add the ith person in the list of cap if with id x
capList[x].push_back(i);
}
}
//----------------------------------------------------

// All mask is used to check whether all persons
// are included or not, set all n bits as 1
allmask = (1 << n) - 1;

// Initialize all entries in dp as -1
memset(dp, -1, sizeof dp);

// Call recursive function count ways
cout << countWaysUtil(0, 1) << endl;
}

// Driver Program
int main()
{
int n; // number of persons in every test case
cin >> n;
countWays(n);
return 0;
}









share|improve this question







New contributor




coding445343 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.

























    0














    Basically I was trying to calculate the time complexity of below solution ,I took this problem from Bit masking cap problem (same question with better explanation bit mask problem)and understand it very well But unable to calculate the time complexity as recursion is going inside loop
    Even my professor didn't get this how to do it?



    BIT MASKING



    There are 100 different types of caps each having a unique id from 1 to 100. Also, there are ‘n’ persons each having a collection of a variable number of caps. One day all of these persons decide to go in a party wearing a cap but to look unique they decided that none of them will wear the same type of cap. So, count the total number of arrangements or ways such that none of them is wearing the same type of cap.



    Constraints: 1 <= n <= 10 Example:



        // C++ program to find number of ways to wear hats 
    #include<bits/stdc++.h>
    #define MOD 1000000007
    using namespace std;

    // capList[i]'th vector contains the list of persons having a cap with id i
    // id is between 1 to 100 so we declared an array of 101 vectors as indexing
    // starts from 0.
    vector<int> capList[101];

    // dp[2^10][101] .. in dp[i][j], i denotes the mask i.e., it tells that
    // how many and which persons are wearing cap. j denotes the first j caps
    // used. So, dp[i][j] tells the number ways we assign j caps to mask i
    // such that none of them wears the same cap
    int dp[1025][101];

    // This is used for base case, it has all the N bits set
    // so, it tells whether all N persons are wearing a cap.
    int allmask;

    // Mask is the set of persons, i is cap-id (OR the
    // number of caps processed starting from first cap).
    long long int countWaysUtil(int mask, int i)
    {
    // If all persons are wearing a cap so we
    // are done and this is one way so return 1
    if (mask == allmask) return 1;

    // If not everyone is wearing a cap and also there are no more
    // caps left to process, so there is no way, thus return 0;
    if (i > 100) return 0;

    // If we already have solved this subproblem, return the answer.
    if (dp[mask][i] != -1) return dp[mask][i];

    // Ways, when we don't include this cap in our arrangement
    // or solution set.
    long long int ways = countWaysUtil(mask, i+1);

    // size is the total number of persons having cap with id i.
    int size = capList[i].size();

    // So, assign one by one ith cap to all the possible persons
    // and recur for remaining caps.
    for (int j = 0; j < size; j++)
    {
    // if person capList[i][j] is already wearing a cap so continue as
    // we cannot assign him this cap
    if (mask & (1 << capList[i][j])) continue;

    // Else assign him this cap and recur for remaining caps with
    // new updated mask vector
    else ways += countWaysUtil(mask | (1 << capList[i][j]), i+1);
    ways %= MOD;
    }

    // Save the result and return it.
    return dp[mask][i] = ways;
    }

    // Reads n lines from standard input for current test case
    void countWays(int n)
    {
    //----------- READ INPUT --------------------------
    string temp, str;
    int x;
    getline(cin, str); // to get rid of newline character
    for (int i=0; i<n; i++)
    {
    getline(cin, str);
    stringstream ss(str);

    // while there are words in the streamobject ss
    while (ss >> temp)
    {
    stringstream s;
    s << temp;
    s >> x;

    // add the ith person in the list of cap if with id x
    capList[x].push_back(i);
    }
    }
    //----------------------------------------------------

    // All mask is used to check whether all persons
    // are included or not, set all n bits as 1
    allmask = (1 << n) - 1;

    // Initialize all entries in dp as -1
    memset(dp, -1, sizeof dp);

    // Call recursive function count ways
    cout << countWaysUtil(0, 1) << endl;
    }

    // Driver Program
    int main()
    {
    int n; // number of persons in every test case
    cin >> n;
    countWays(n);
    return 0;
    }









    share|improve this question







    New contributor




    coding445343 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.























      0












      0








      0







      Basically I was trying to calculate the time complexity of below solution ,I took this problem from Bit masking cap problem (same question with better explanation bit mask problem)and understand it very well But unable to calculate the time complexity as recursion is going inside loop
      Even my professor didn't get this how to do it?



      BIT MASKING



      There are 100 different types of caps each having a unique id from 1 to 100. Also, there are ‘n’ persons each having a collection of a variable number of caps. One day all of these persons decide to go in a party wearing a cap but to look unique they decided that none of them will wear the same type of cap. So, count the total number of arrangements or ways such that none of them is wearing the same type of cap.



      Constraints: 1 <= n <= 10 Example:



          // C++ program to find number of ways to wear hats 
      #include<bits/stdc++.h>
      #define MOD 1000000007
      using namespace std;

      // capList[i]'th vector contains the list of persons having a cap with id i
      // id is between 1 to 100 so we declared an array of 101 vectors as indexing
      // starts from 0.
      vector<int> capList[101];

      // dp[2^10][101] .. in dp[i][j], i denotes the mask i.e., it tells that
      // how many and which persons are wearing cap. j denotes the first j caps
      // used. So, dp[i][j] tells the number ways we assign j caps to mask i
      // such that none of them wears the same cap
      int dp[1025][101];

      // This is used for base case, it has all the N bits set
      // so, it tells whether all N persons are wearing a cap.
      int allmask;

      // Mask is the set of persons, i is cap-id (OR the
      // number of caps processed starting from first cap).
      long long int countWaysUtil(int mask, int i)
      {
      // If all persons are wearing a cap so we
      // are done and this is one way so return 1
      if (mask == allmask) return 1;

      // If not everyone is wearing a cap and also there are no more
      // caps left to process, so there is no way, thus return 0;
      if (i > 100) return 0;

      // If we already have solved this subproblem, return the answer.
      if (dp[mask][i] != -1) return dp[mask][i];

      // Ways, when we don't include this cap in our arrangement
      // or solution set.
      long long int ways = countWaysUtil(mask, i+1);

      // size is the total number of persons having cap with id i.
      int size = capList[i].size();

      // So, assign one by one ith cap to all the possible persons
      // and recur for remaining caps.
      for (int j = 0; j < size; j++)
      {
      // if person capList[i][j] is already wearing a cap so continue as
      // we cannot assign him this cap
      if (mask & (1 << capList[i][j])) continue;

      // Else assign him this cap and recur for remaining caps with
      // new updated mask vector
      else ways += countWaysUtil(mask | (1 << capList[i][j]), i+1);
      ways %= MOD;
      }

      // Save the result and return it.
      return dp[mask][i] = ways;
      }

      // Reads n lines from standard input for current test case
      void countWays(int n)
      {
      //----------- READ INPUT --------------------------
      string temp, str;
      int x;
      getline(cin, str); // to get rid of newline character
      for (int i=0; i<n; i++)
      {
      getline(cin, str);
      stringstream ss(str);

      // while there are words in the streamobject ss
      while (ss >> temp)
      {
      stringstream s;
      s << temp;
      s >> x;

      // add the ith person in the list of cap if with id x
      capList[x].push_back(i);
      }
      }
      //----------------------------------------------------

      // All mask is used to check whether all persons
      // are included or not, set all n bits as 1
      allmask = (1 << n) - 1;

      // Initialize all entries in dp as -1
      memset(dp, -1, sizeof dp);

      // Call recursive function count ways
      cout << countWaysUtil(0, 1) << endl;
      }

      // Driver Program
      int main()
      {
      int n; // number of persons in every test case
      cin >> n;
      countWays(n);
      return 0;
      }









      share|improve this question







      New contributor




      coding445343 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      Basically I was trying to calculate the time complexity of below solution ,I took this problem from Bit masking cap problem (same question with better explanation bit mask problem)and understand it very well But unable to calculate the time complexity as recursion is going inside loop
      Even my professor didn't get this how to do it?



      BIT MASKING



      There are 100 different types of caps each having a unique id from 1 to 100. Also, there are ‘n’ persons each having a collection of a variable number of caps. One day all of these persons decide to go in a party wearing a cap but to look unique they decided that none of them will wear the same type of cap. So, count the total number of arrangements or ways such that none of them is wearing the same type of cap.



      Constraints: 1 <= n <= 10 Example:



          // C++ program to find number of ways to wear hats 
      #include<bits/stdc++.h>
      #define MOD 1000000007
      using namespace std;

      // capList[i]'th vector contains the list of persons having a cap with id i
      // id is between 1 to 100 so we declared an array of 101 vectors as indexing
      // starts from 0.
      vector<int> capList[101];

      // dp[2^10][101] .. in dp[i][j], i denotes the mask i.e., it tells that
      // how many and which persons are wearing cap. j denotes the first j caps
      // used. So, dp[i][j] tells the number ways we assign j caps to mask i
      // such that none of them wears the same cap
      int dp[1025][101];

      // This is used for base case, it has all the N bits set
      // so, it tells whether all N persons are wearing a cap.
      int allmask;

      // Mask is the set of persons, i is cap-id (OR the
      // number of caps processed starting from first cap).
      long long int countWaysUtil(int mask, int i)
      {
      // If all persons are wearing a cap so we
      // are done and this is one way so return 1
      if (mask == allmask) return 1;

      // If not everyone is wearing a cap and also there are no more
      // caps left to process, so there is no way, thus return 0;
      if (i > 100) return 0;

      // If we already have solved this subproblem, return the answer.
      if (dp[mask][i] != -1) return dp[mask][i];

      // Ways, when we don't include this cap in our arrangement
      // or solution set.
      long long int ways = countWaysUtil(mask, i+1);

      // size is the total number of persons having cap with id i.
      int size = capList[i].size();

      // So, assign one by one ith cap to all the possible persons
      // and recur for remaining caps.
      for (int j = 0; j < size; j++)
      {
      // if person capList[i][j] is already wearing a cap so continue as
      // we cannot assign him this cap
      if (mask & (1 << capList[i][j])) continue;

      // Else assign him this cap and recur for remaining caps with
      // new updated mask vector
      else ways += countWaysUtil(mask | (1 << capList[i][j]), i+1);
      ways %= MOD;
      }

      // Save the result and return it.
      return dp[mask][i] = ways;
      }

      // Reads n lines from standard input for current test case
      void countWays(int n)
      {
      //----------- READ INPUT --------------------------
      string temp, str;
      int x;
      getline(cin, str); // to get rid of newline character
      for (int i=0; i<n; i++)
      {
      getline(cin, str);
      stringstream ss(str);

      // while there are words in the streamobject ss
      while (ss >> temp)
      {
      stringstream s;
      s << temp;
      s >> x;

      // add the ith person in the list of cap if with id x
      capList[x].push_back(i);
      }
      }
      //----------------------------------------------------

      // All mask is used to check whether all persons
      // are included or not, set all n bits as 1
      allmask = (1 << n) - 1;

      // Initialize all entries in dp as -1
      memset(dp, -1, sizeof dp);

      // Call recursive function count ways
      cout << countWaysUtil(0, 1) << endl;
      }

      // Driver Program
      int main()
      {
      int n; // number of persons in every test case
      cin >> n;
      countWays(n);
      return 0;
      }






      c++ algorithm recursion dynamic-programming






      share|improve this question







      New contributor




      coding445343 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question







      New contributor




      coding445343 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question






      New contributor




      coding445343 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 1 hour ago









      coding445343

      1




      1




      New contributor




      coding445343 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      coding445343 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      coding445343 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.



























          active

          oldest

          votes











          Your Answer





          StackExchange.ifUsing("editor", function () {
          return StackExchange.using("mathjaxEditing", function () {
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
          });
          });
          }, "mathjax-editing");

          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "196"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });






          coding445343 is a new contributor. Be nice, and check out our Code of Conduct.










          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210561%2ftime-complexity-of-bit-mask%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown






























          active

          oldest

          votes













          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          coding445343 is a new contributor. Be nice, and check out our Code of Conduct.










          draft saved

          draft discarded


















          coding445343 is a new contributor. Be nice, and check out our Code of Conduct.













          coding445343 is a new contributor. Be nice, and check out our Code of Conduct.












          coding445343 is a new contributor. Be nice, and check out our Code of Conduct.
















          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210561%2ftime-complexity-of-bit-mask%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Morgemoulin

          Scott Moir

          Souastre