枚举生成可重集排列
2013-07-19 17:31
239 查看
/*枚举生成可重集排列*/ #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("\n"); } 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\n",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("\n"); } 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("\n"); }while(next_permutation(P,P+n));//调用算法中函数求写一个排序 printf("sum = %d\n",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 */
相关文章推荐
- 枚举排列问题:生成1-n的排列和可重集排列问题
- 暴力求解法_枚举排列(生成1~n 的排列,生成可重集的排列,下一个排列)
- 枚举排列----生成可重集的排列
- HDU 4771 Stealing Harry Potter's Precious (生成排列+枚举 + BFS)
- 生成可重集的排列
- (排列生成算法)枚举排列的两种方法:递归枚举和next_permutation (使用多用next_permutation)
- 递归枚举,子集生成,排列生成,回溯都是解决解答树的方法,通过数值跟踪保存排序过程
- 生成1~n的排列 生成可重集的排列 下一个排列
- 生成可重集的排列模板
- 生成可重集的排列
- 生成可重集的排列(方法)
- Poj-1731 Orders(生成可重集的排列)
- 生成可重集排列
- 算法--生成可重集排列
- 生成可重集的排列
- 729 - The Hamming Distance Problem(可重集排列,直接枚举)
- 生成可重集的排列
- [Day 1] 7.2.2 生成可重集的排列(包括利用STL)
- 枚举生成1-n的排列
- 生成可重集的排列