Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define N 101
- #define inf 99999
- #define dbg printf("in\n");
- using namespace std;
- int sz[N];
- int subSet[N][N];
- int elementCount, subsetCount;
- vector<bool> fn;
- int cnt;
- void setCover(int *bt, int lvl)
- {
- unordered_set<int> s;
- int taken=0,mx=0;
- for(int i=0;i<subsetCount;i++)
- {
- if(bt[i]==1)
- {
- taken++;
- for(int j=0;j<sz[i];j++)
- s.insert(subSet[i][j]);
- }
- else
- {
- mx=max(mx,sz[i]);
- }
- }
- cout<<lvl<<" "<<taken<<endl;
- //all done
- if(s.size()==elementCount)
- {
- for(int i=0;i<subsetCount;i++)
- cout<<bt[i];
- cout<<endl;
- if(cnt>taken)
- {
- while(fn.size())
- fn.pop_back();
- for(int i=0;i<subsetCount;i++)
- fn.push_back(bt[i]);
- cnt=taken;
- }
- return;
- }
- int lowerBound=inf;
- float temp=(float)(elementCount-s.size())/mx;
- lowerBound=taken+ceil(temp);
- //prune
- if(lowerBound>=cnt)
- return;
- if(lvl<subsetCount)
- {
- setCover(bt,lvl+1);
- bt[lvl]=1;
- setCover(bt,lvl+1);
- }
- }
- int main()
- {
- int i, j, x;
- string s;
- scanf("%d %d", &elementCount, &subsetCount);
- for (i = 0; i <= subsetCount; i++)
- {
- sz[i] = 0;
- }
- for (i = 0; i <= subsetCount; i++)
- {
- getline(cin, s);
- stringstream str(s);
- j = 0;
- while (str >> x)
- {
- subSet[i - 1][j] = x;
- sz[i - 1]++;
- j++;
- }
- }
- int p[subsetCount];
- for(i=0;i<subsetCount;i++)
- p[i]=0;
- cnt=inf;
- setCover(p,0);
- cout<<cnt<<endl;
- for(i=0;i<subsetCount;i++)
- {
- if(fn[i])
- {
- for(j=0;j<sz[i];j++)
- cout<<subSet[i][j]<<" ";
- cout<<endl;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement