使用stl给出重复子集的超集算法

时间:2014-12-14 12:30:19

标签: c++ recursion vector stl-algorithm superset

我正在尝试找到给定向量的超集。我通过递归来做到这一点。迭代地去除一个值,然后用新的集合调用该函数。我得到了所有套装,但他们重复了。例如,对于5个元素,应该有32到31个子集,而我得到大约206个子集。 这是我的代码

using namespace std;
int iter = 1;
void display(vector<int> &v)
{
    cout<<"case#"<<iter++<<": ";
    vector<int>::iterator i;
    for(i=v.begin();i!=v.end();i++)
        cout<<*i<<" ";
    cout<<endl;
}
void gen( vector<int> &v)
{
    if(v.size()==0) return;
        display(v);
    vector<int>::iterator j,i;
    for(i=v.begin();i!=v.end();i++)
    {
       vector<int> t(v);
       j = find(t.begin(),t.end(),*i);
       t.erase(j);
       gen(t);
    }
}

1 个答案:

答案 0 :(得分:1)

您不必每次都将v作为参数传递。让它成为全球性的。

尝试每种组合以找到所有子集。

复杂性:2 ^ N

vector<int>v;
int iter = 1;
int take[20];
void display()
{
    cout<<"Case#"<<iter++<<": ";
    int n=v.size();
    for(int i=0;i<n;i++)
    {
        if(take[i])
          cout<<v[i]<<" ";
    }
    cout<<endl;
}
void gen(int x)
{
    if(x==v.size())
    {
        display();
        return;
    }
    int i,j,n=v.size();
    take[x]=1;
    gen(x+1);
    take[x]=0;
    gen(x+1);
}
int main()
{
    int i,j,n;

    cin>>n;

    for(i=0;i<n;i++)
    {
        cin>>j;
        v.push_back(j);
    }
    gen(0);
    return 0;
}