码迷,mamicode.com
首页 > 其他好文 > 详细

枚举有重复元素的组合

时间:2018-09-11 21:28:20      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:==   space   max   put   main   ace   组合   oid   mes   

之前有一篇博文有介绍枚举又重复元素的排列,这里先介绍一下怎么正常枚举有重复元素的组合

首先先来一个仅支持不同元素的枚举组合的程序

多年前的知识宝藏

 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 }

 

枚举有重复元素的组合

标签:==   space   max   put   main   ace   组合   oid   mes   

原文地址:https://www.cnblogs.com/aininot260/p/9629772.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!