枚举生成可重集的排列

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=1e3+10;
int a[N],p[N];
void print_permutation(int n,int *p,int *a,int cur)
{
int i,j;
if(cur==n)
{
for(i=0; i<n; i++)
printf("%d ",a[i]);
printf("\n");
}
else
{
for(i=0; i<n; i++)
if(p[i]!=p[i-1])
{
int c1=0,c2=0;
for(j=0; j<cur; j++)
if(a[j]==p[i])
c1++;
for(j=0; j<n; j++)
if(p[i]==p[j])
c2++;
if(c1<c2)
{
a[cur]=p[i];
print_permutation(n,p,a,cur+1);
}
}
}
}
int main()
{
int n,i;
while(scanf("%d",&n))
{
for(i=0; i<n; i++)
scanf("%d",&p[i]);
sort(p,p+n);
print_permutation(n,p,a,0);
}
return 0;
}

posted @ 2015-01-09 09:33  zach96  阅读(153)  评论(0编辑  收藏  举报