1. 程式人生 > >枚舉有重復元素的組合

枚舉有重復元素的組合

知識 正常 sort 組合 介紹 include 不同 元素 class

之前有一篇博文有介紹枚舉又重復元素的排列,這裏先介紹一下怎麽正常枚舉有重復元素的組合

首先先來一個僅支持不同元素的枚舉組合的程序

多年前的知識寶藏

 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 }

枚舉有重復元素的組合