不得不说递归大法太棒了,这里参考了刘汝佳写的算法
#include <bits/stdc++.h>
using namespace std;
int p[100];
void print(int n,int*A,int cur)
{
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==0||p[i]==p[i-1])//可防止相同元素重复递归
{
int c1=0,c2=0;
for(int j=0;j<cur;j++) if(A[j]==p[i]) c1++;//c1,c2用来判断相同元素是否重复
for(int j=0;j<n;j++) if(p[i]==p[j]) c2++;
if(c1<c2)
{
A[cur]=p[i];
print(n,A,cur+1);
}
}
}
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int A[100];
for(int i=0;i<n;i++)
scanf("%d",&p[i]);
sort(p,p+n);
print(n,A,0);
}
return 0;
}
另外,生成可重集的还可以调用C++的库函数next_permutation
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,p[10];
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
scanf("%d",&p[i]);
sort(p,p+n);
do{
for(int i=0;i<n;i++)
printf("%d ",p[i]);
printf("\n");
}while(next_permutation(p,p+n));
}
return 0;
}