枚举有重复元素的组合

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 }

 

以上是关于枚举有重复元素的组合的主要内容,如果未能解决你的问题,请参考以下文章

简单枚举---从一数组中任取n个元素

枚举有重复元素的排列的两种方法

Python:枚举列表中所有元素的可能组合

48个值得掌握的JavaScript代码片段(上)

Java 全排列与组合

JavaScript 代码片段