/*枚举生成可重集排列*/ #include <iostream> #include<algorithm> #include<queue> #include<stack> #include<cmath> #include<string.h> #include<stdio.h> #include<stdlib.h> using namespace std; #define maxn 2600000 int A[maxn]; int P[maxn]; int sum; void print_p(int n,int *A,int *P,int cur) { int i,j; if(cur==n) { for(i=0; i<n; i++) printf("%d ",A[i]); sum++; printf(" "); } else { for(i=0; i<n; i++) { if(!i||P[i]!=P[i-1]) // int ok=1; { int c1=0,c2=0; for(j=0; j<cur; j++)//统计A[0]~A[cur-1]中p[i]出现的次数 if(A[j]==P[i]) c1++; for(j=0; j<n; j++)//统计P数组中P[i]的出现次数c2 if(P[i]==P[j]) c2++; // if(A[j]==i) //ok=0; if(c1<c2)//只要c1<c2,就可以递归调用 { A[cur] = P[i]; print_p(n,A,P,cur+1); } } } } } int main() { int n,i; while(~scanf("%d",&n)) { sum=0; for(i=0; i<n; i++) scanf("%d",&P[i]); sort(P,P+n); print_p(n,A,P,0); printf("sum = %d ",sum); } return 0; } /* 5 1 3 1 3 1 1 1 1 3 3 1 1 3 1 3 1 1 3 3 1 1 3 1 1 3 1 3 1 3 1 1 3 3 1 1 3 1 1 1 3 3 1 1 3 1 3 1 3 1 1 3 3 1 1 1 sum = 10 */
/*调用算法中函数求写一个排序*/ #include <iostream> #include<algorithm> #include<queue> #include<stack> #include<cmath> #include<string.h> #include<stdio.h> #include<stdlib.h> using namespace std; #define maxn 2600000 int A[maxn]; int P[maxn]; int sum; /*void print_p(int n,int *A,int *P,int cur) { int i,j; if(cur==n) { for(i=0; i<n; i++) printf("%d ",A[i]); sum++; printf(" "); } else { for(i=0; i<n; i++) { if(!i||P[i]!=P[i-1]) // int ok=1; { int c1=0,c2=0; for(j=0; j<cur; j++)//统计A[0]~A[cur-1]中p[i]出现的次数 if(A[j]==P[i]) c1++; for(j=0; j<n; j++)//统计P数组中P[i]的出现次数c2 if(P[i]==P[j]) c2++; // if(A[j]==i) //ok=0; if(c1<c2)//只要c1<c2,就可以递归调用 { A[cur] = P[i]; print_p(n,A,P,cur+1); } } } } }*/ int main() { int n,i; while(~scanf("%d",&n)) { sum=0; for(i=0; i<n; i++) scanf("%d",&P[i]); sort(P,P+n); //print_p(n,A,P,0); do { for(i=0;i<n;i++) printf("%d ",P[i]); sum++; printf(" "); }while(next_permutation(P,P+n));//调用算法中函数求写一个排序 printf("sum = %d ",sum); } return 0; } /* 5 1 3 1 3 1 1 1 3 3 1 3 1 3 1 3 3 1 3 1 1 3 3 1 3 1 3 3 1 1 1 1 1 3 1 1 3 1 1 3 1 1 3 1 1 1 sum = 10 */