生成一组数的子集的组合数和排列数

#include <iostream>
#include <vector>
using namespace std;
int length,n;
vector<vector<int>> ans;

void find(vector<int> &a,vector<int> &t,int index){
    if(t.size() == length){    //长度为指定长度时,保存到ans后,返回,结束这一次递归
        ans.push_back(t);
        return;
    }
    for(int i=index;i<n;i++){
            t.push_back(a[i]);
            find(a,t,i+1);
            t.pop_back();    //回溯
    }
}
int main()
{
    cin>>n;
    vector<int> a(n,0),t;
    for(int i=0;i<n;i++)
        cin>>a[i];
    
    for(int i=1;i<=n;i++){    //长度递增
        length++;
        find(a,t,0);
 
    }
    for(int i=0;i<ans.size();i++){
        for(int j=0;j<ans[i].size();j++)
            cout<<ans[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
vector<vector<int>> ans;
vector<int> tmp, a;
int v[10010];

void get(int id,int len)
{
    if(id==len){
        ans.push_back(tmp);
        return;
    }
    
    for(int i=0;i<a.size();i++)
    {
        if(v[i]) continue;
        tmp.push_back(a[i]);
        v[i]=1;
        get(id+1,len);
        tmp.pop_back();
        v[i]=0;
    }
}

int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        a.push_back(x);
    } 
    
    for(int i=1;i<=n;i++) get(0,i);
    // get(0,2);
    
    for(int i=0;i<ans.size();i++)
    {
        for(int j=0;j<ans[i].size();j++) cout<<ans[i][j]<<' ';
        cout<<endl;
    }
    
    return 0;
}

 

posted @ 2022-02-22 18:09  兮何其  阅读(35)  评论(0)    收藏  举报