生成可重集的排列

来源:互联网 发布:mysql 日志保留时间 编辑:程序博客网 时间:2024/06/02 11:01

把数组中每个元素不重复的取到,并且不超过数组中某个元素的个数。

代码如下

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1000+5;int res[maxn]; //统计数组中某个元素出现的次数void dfs(int *a,int *p,int cur,int n){    if(cur==n)    {        for(int i=0;i<n;++i)        {            printf("%d ",a[i]);        }        printf("\n");    }    else for(int i=0;i<n;++i)    {        if(!i||p[i]!=p[i-1])        {            int cnt=0;            for(int j=0;j<cur;++j)            {                if(a[j]==p[i]) ++cnt;            }            if(cnt<res[p[i]])            {                a[cur]=p[i];                dfs(a,p,cur+1,n);            }        }    }}int main(){    int n; scanf("%d",&n);    memset(res,0,sizeof(res));    int p[maxn],a[maxn];    for(int i=0;i<n;++i){        scanf("%d",&p[i]);        res[p[i]]++;    }    sort(p,p+n); //排序,方便判定    dfs(a,p,0,n);    return 0;}

如有不当之处欢迎指出!

0 0
原创粉丝点击