您的位置:首页 > 其它

生成可重集的排列

2016-08-10 13:43 183 查看
把数组中每个元素不重复的取到,并且不超过数组中某个元素的个数。

代码如下

#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;
}


如有不当之处欢迎指出!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: