枚举有重复元素的组合
Posted aininot260
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了枚举有重复元素的组合相关的知识,希望对你有一定的参考价值。
之前有一篇博文有介绍枚举又重复元素的排列,这里先介绍一下怎么正常枚举有重复元素的组合
首先先来一个仅支持不同元素的枚举组合的程序
多年前的知识宝藏
1 #include<cstdio> 2 const int maxn=1005; 3 int n,m,ans; 4 int a[maxn],vi[maxn]; 5 void dfs(int dp) 6 { 7 if(dp>m) 8 { 9 for(int i=1;i<=m;i++) printf("%d",a[i]); 10 ans++; 11 puts(""); 12 return; 13 } 14 for(int i=vi[dp-1]+1;i<=n;i++) 15 { 16 vi[dp]=i; 17 a[dp]=i; 18 dfs(dp+1); 19 } 20 } 21 int main() 22 { 23 scanf("%d%d",&n,&m); 24 dfs(1); 25 return 0; 26 }
然而错了好几次才写出来
然后我魔改了一个枚举有重复元素组合的程序,直接哈希判重了
脑子实在是转不动了
应该是对的,效率那是十分底下
1 #include<cstdio> 2 #include<string> 3 #include<algorithm> 4 #include<map> 5 using namespace std; 6 const int maxn=1005; 7 int n,m,ans; 8 int a[maxn],st[maxn],vi[maxn]; 9 map<string,bool> mp; 10 void dfs(int dp,string s) 11 { 12 if(dp>m) 13 { 14 if(mp[s]==0) 15 { 16 for(int i=1;i<=m;i++) printf("%d",st[i]); 17 ans++; 18 puts(""); 19 mp[s]=1; 20 } 21 return; 22 } 23 for(int i=vi[dp-1]+1;i<=n;i++) 24 { 25 vi[dp]=i; 26 st[dp]=a[i]; 27 dfs(dp+1,s+char(a[i]+‘0‘)); 28 } 29 } 30 int main() 31 { 32 scanf("%d%d",&n,&m); 33 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 34 sort(a+1,a+n+1); 35 dfs(1,""); 36 return 0; 37 }
以上是关于枚举有重复元素的组合的主要内容,如果未能解决你的问题,请参考以下文章