1 . 无重复元素的全排列
当然stl有next_permutation()函数,用起来更方便
#include<cstdio> #include<string> using namespace std; int n,a[100],count; void permutation(int k){ if(k==n){ for(int i=1;i<=n;i++) printf("%d ",a[i]); printf("\n"); count++; return; } for(int i=k;i<=n;i++){ int tem=a[k]; a[k]=a[i]; a[i]=tem; permutation(k+1); tem=a[k]; a[k]=a[i]; a[i]=tem; } } int main(){ while(scanf("%d",&n)!=EOF){ for(int i=1;i<=n;i++) a[i]=i; //scanf("%d",&a[i]); count=0; permutation(1); printf("There is %d permutatiomns\n",count); } }
2 . 有重复元素的全排列
#include<cstdio> #include<string> #include<map> using namespace std; int n,m,seq[100],sum[100],count,out[100]; //n表示输入字符数,m表示不重复字符数 void permutation(int k){ if(k==n+1){ for(int i=1;i<=n;i++) printf("%d ",out[i]); printf("\n"); count++; return; } for(int i=1;i<=m;i++) if(sum[i]){ sum[i]--; out[k]=seq[i]; permutation(k+1); sum[i]++; } } int main(){ int tem; while(scanf("%d",&n)!=EOF){ map<int,int>ma; m=0; memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++){ scanf("%d",&tem); if(ma[tem]!=0) sum[ma[tem]]++; else{ seq[++m]=tem; sum[m]=1; ma[tem]=m; } } count=0; permutation(1); printf("There is %d permutatiomns\n",count); } }
3 . 有重复元素的组合
#include<cstdio> #include<string> #include<map> using namespace std; int n,k,m,seq[100],sum[100],count,out[100]; //n表示输入字符数,m表示不重复字符数 void combination(int now,int p){ if(now==k+1){ for(int i=1;i<=k;i++) printf("%d ",out[i]); printf("\n"); count++; return; } for(int i=p;i<=m;i++) if(sum[i]){ sum[i]--; out[now]=seq[i]; combination(now+1,i); sum[i]++; } } int main(){ int tem; while(scanf("%d %d",&n,&k)!=EOF){ map<int,int>ma; m=0; memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++){ scanf("%d",&tem); if(ma[tem]!=0) sum[ma[tem]]++; else{ seq[++m]=tem; sum[m]=1; ma[tem]=m; } } count=0; combination(1,1); printf("There is %d combinations\n",count); } }
4 . 有重复元素的全组合
#include<cstdio> #include<string> #include<map> using namespace std; int n,k,m,seq[100],sum[100],count,out[100]; //n表示输入字符数,m表示不重复字符数 void combination(int now,int p){ if(now>1){ for(int i=1;i<now;i++) printf("%d ",out[i]); printf("\n"); count++; } for(int i=p;i<=m;i++) if(sum[i]){ sum[i]--; out[now]=seq[i]; combination(now+1,i); sum[i]++; } } int main(){ int tem; while(scanf("%d",&n)!=EOF){ map<int,int>ma; m=0; memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++){ scanf("%d",&tem); if(ma[tem]!=0) sum[ma[tem]]++; else{ seq[++m]=tem; sum[m]=1; ma[tem]=m; } } count=0; combination(1,1); printf("There is %d combinations\n",count); } }