Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. #define N 101
  4. #define inf 99999
  5. #define dbg printf("in\n");
  6.  
  7. using namespace std;
  8.  
  9. int sz[N];
  10. int subSet[N][N];
  11. int elementCount, subsetCount;
  12.  
  13. vector<bool> fn;
  14. int cnt;
  15.  
  16. void setCover(int *bt, int lvl)
  17. {
  18.     unordered_set<int> s;
  19.     int taken=0,mx=0;
  20.  
  21.     for(int i=0;i<subsetCount;i++)
  22.     {
  23.         if(bt[i]==1)
  24.         {
  25.             taken++;
  26.             for(int j=0;j<sz[i];j++)
  27.                 s.insert(subSet[i][j]);
  28.         }
  29.  
  30.         else
  31.         {
  32.             mx=max(mx,sz[i]);
  33.         }
  34.     }
  35.  
  36.     cout<<lvl<<" "<<taken<<endl;
  37.  
  38.     //all done
  39.     if(s.size()==elementCount)
  40.     {
  41.         for(int i=0;i<subsetCount;i++)
  42.             cout<<bt[i];
  43.  
  44.         cout<<endl;
  45.         if(cnt>taken)
  46.         {
  47.             while(fn.size())
  48.                 fn.pop_back();
  49.  
  50.             for(int i=0;i<subsetCount;i++)
  51.                 fn.push_back(bt[i]);
  52.  
  53.             cnt=taken;
  54.         }
  55.  
  56.         return;
  57.     }
  58.  
  59.     int lowerBound=inf;
  60.     float temp=(float)(elementCount-s.size())/mx;
  61.  
  62.     lowerBound=taken+ceil(temp);
  63.  
  64.     //prune
  65.     if(lowerBound>=cnt)
  66.         return;
  67.  
  68.  
  69.     if(lvl<subsetCount)
  70.     {
  71.         setCover(bt,lvl+1);
  72.  
  73.         bt[lvl]=1;
  74.         setCover(bt,lvl+1);
  75.     }
  76. }
  77.  
  78. int main()
  79. {
  80.     int  i, j, x;
  81.     string s;
  82.  
  83.     scanf("%d %d", &elementCount, &subsetCount);
  84.  
  85.     for (i = 0; i <= subsetCount; i++)
  86.     {
  87.         sz[i] = 0;
  88.     }
  89.  
  90.     for (i = 0; i <= subsetCount; i++)
  91.     {
  92.         getline(cin, s);
  93.         stringstream str(s);
  94.  
  95.         j = 0;
  96.  
  97.         while (str >> x)
  98.         {
  99.             subSet[i - 1][j] = x;
  100.             sz[i - 1]++;
  101.             j++;
  102.         }
  103.     }
  104.  
  105.     int p[subsetCount];
  106.     for(i=0;i<subsetCount;i++)
  107.         p[i]=0;
  108.  
  109.     cnt=inf;
  110.     setCover(p,0);
  111.  
  112.     cout<<cnt<<endl;
  113.     for(i=0;i<subsetCount;i++)
  114.     {
  115.         if(fn[i])
  116.         {
  117.             for(j=0;j<sz[i];j++)
  118.                 cout<<subSet[i][j]<<" ";
  119.  
  120.             cout<<endl;
  121.         }
  122.     }
  123.  
  124.     return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement