-3

我正在尝试查找给定向量的超集。我通过递归来做到这一点。迭代地,我删除一个值,然后用新集合调用函数。我得到了所有的集合,但它们是重复的。例如,对于 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);
    }
}
4

1 回答 1

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;
}
于 2014-12-15T19:07:15.103 回答