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);
- }
- }
#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);
- }
- }
#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);
- }
- }
#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);
- }
- }
#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);
}
}