#include<stdio.h>
#include<algorithm>
using namespace std;
void print(int n,int *p,int *a,int cur)
{
if(cur==n)//递归边界
{
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
else //尝试在A[cur]中填各种整数i
{
for(int i=0;i<n;i++)
{
if(i==0||p[i]!=p[i-1])
{
int cnt1=0,cnt2=0;
//用来判断
for(int j=0;j<cur;j++)
{
if(a[j]==p[i]) cnt1++;
}
for(int j=0;j<n;j++)
{
if(p[i]==p[j]) cnt2++;
}
if(cnt1<cnt2)
{
a[cur]=p[i];
print(n,p,a,cur+1);
}
}
}
}
}
int main()
{
int a[110],p[110],n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&p[i]);
sort(p,p+n);
print(n,p,a,0);
}
/*
3
1 2 3
5
2 3 4 5 1
*/
7.2.2生成可重集的排列
最新推荐文章于 2024-09-26 17:12:37 发布