zoukankan      html  css  js  c++  java
  • 搜索:枚举多重集组合

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

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

    多年前的知识宝藏

     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 }
  • 相关阅读:
    [HDU 4828] Grids
    约瑟夫问题合集
    [POJ 1365] Prime Land
    [POJ 3270] Cow Sorting
    [POJ 1674] Sorting by Swapping
    SGU 188.Factory guard
    POJ 2942.Knights of the Round Table (双连通)
    POJ 1236.Network of Schools (强连通)
    POJ 2186.Popular Cows (强连通)
    POJ 1734.Sightseeing trip (Floyd 最小环)
  • 原文地址:https://www.cnblogs.com/aininot260/p/9629772.html
Copyright © 2011-2022 走看看