排列组合(三)
来源:互联网 发布:剑灵帅气灵男捏脸数据 编辑:程序博客网 时间:2024/06/01 14:12
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);
- }
- }
阅读全文
0 0
- 排列组合(三)
- 【笔试/面试】排列组合与概率计算(三)
- 打靶 (排列组合)
- 排列组合(二)
- hdu 1261(排列组合)
- 排列组合问题(1)
- hdu 5366(排列组合)
- Benches(排列组合)
- Indivisibility(最大公约数+排列组合)
- bzoj3505(排列组合)
- bzoj1600(排列组合)
- Number Sequence (排列组合)
- 开会(排列组合)
- 取三角形(排列组合 )
- 排列组合(Permutations)
- 带分数(排列组合)
- Round Numbers (排列组合)
- 插板法(排列组合)
- 141. Linked List Cycle (链表)
- Android------Binder natvite层架构浅析
- 暑期学习 GAN 笔记
- Summer sell-off (Codeforces-810B)
- Python进行特征提取
- 排列组合(三)
- JAVA开发的23种设计模式之 — 责任链模式
- 单向链表-创建
- Java读取文件----中文乱码问题
- Java基础对象、bean、spring boot
- 字典循环训练
- 基于docker的TensorFlow开发环境搭建
- Oracle笔记
- [HNOI2015]菜肴制作 拓扑序