生成可重复集
代码:#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
const int N=1e7+5;//声明一个足够大的数组A;
int A[N];//数组
int P[N];
void print_permutation(int n,int *P,int *A,int cur){//n代表有多少位数。数组A是用来存储,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||P[i]!=P[i-1]){
int c1=0,c2=0;
for(int 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;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&P[i]);
sort(P,P+n);
print_permutation(n,P,A,0);
return 0;
}

图片发自简书App

图片发自简书App