向各位大侠求救:
现有一个集合如:{A,B,C,D} // 当然,个数不定,现例子是4个,实际可能不止. 其中A,B,C,D有可能是一组数字.
现我需要得到所有的无序的子集合,而且这些子集合完全包括所有的成员,例子如下:
1. A,B,C,D 
2. ABCD
3. A,BCD // 注: {BCD,A}或{BDC,A}或{CDB,A}视为相同. 因为是无序
4. AB,CD
5. ABC,D
6. AC,BD
7. AD,BC
8. ABD,C
9. ADC,B
.....
此算法如何写? 在线等...

解决方案 »

  1.   

    参考
    http://www.cnblogs.com/rogerwei/archive/2010/11/18/1880336.html
      

  2.   

    我觉得先把你所有的东西都存到一个 string里面 ABCDEF......这样的 然后  把 字符","加到这个里面..
    如 0个"," 的时候 就是 原来的  ,一个的时候就
    for(int i=1;i<string.lengthg; i++)
    { string.addat(i,",") };
    这个一个一个的去枚举吧.
      

  3.   

     static void Main(string[] args)
            {
                string myst = "ABCDEF";
                List<string> myresult=new List<string>();
                
                for (int i = 1; i <myst.Length; i++)
                {
                    for (int j = i + 1; j < myst.Length; j++)
                    {
                        string result = myst.Insert(i, ",").Insert(j+1,",");
                        myresult.Add(result);
                    }
                }
                foreach (var a in myresult)
                {
                    Console.WriteLine(a);
                }
                Console.ReadLine();
            }
      

  4.   

     你這個不行哦,就算是固定的集合,比如 ADE,BC 或 AE,BCD之類的也出不來的.
      

  5.   

    1.写一个方法返回所有子集合的集合List<string> strList2.
    int count = 0;
    List<int> index;
    List<string> randomList;
    for (count; count < strList.Count ; )
    {   
       Random r = new Random();
       if (!index.Contains(r.Next(0, strList.Count))
       {
          randomList.Add(strList[index]);
          count++;
       }
    }
     
      

  6.   

                char[] myarray = { 'a', 'b','c','d' };
                 List<string> strList=new List<string>();
                  int length = myarray.Length;
                  for (int i = 0; i < Math.Pow(2, length); i++)
                   {
                      string myst=null;
                      for (int j = 0; j < length; j++)
                     {
                        if ( Convert.ToBoolean( i & (1 << j))) myst += myarray[j].ToString();
                       }
                      strList.Add(myst);
                    }
                这个事求子集的算法,,楼上的子集试试 硬是没看明白你的事什么意思???random()都来了
      

  7.   

    http://topic.csdn.net/u/20120822/17/9b494cf2-901b-4da9-bca7-d28ff55932e8.html
      

  8.   

    算了. 看来还是得靠自己.我是这样写的,大家提点意见.
     public void Test_Main()
            {
                string[] strs = { "111", "222", "333", "444" };
                List<string > results = new List<string> ();         
                enum_array(string.Empty ,0, strs, results ); 
            }
      void Get_enumList(string prefix, int dim, string[] chs, List<string> results)
            {
                if (dim >= chs.Length)
                    return;
                string ls_rcstr = prefix, splitchar = ",", nextprefix ;
                for (int i = 0; i < chs.Length; i++)
                {
                    if (prefix.Contains(chs[i]))
                        continue;
                    if (prefix == string.Empty)
                        ls_rcstr = chs[i];
                    else
                        ls_rcstr = prefix + splitchar + chs[i];                nextprefix = ls_rcstr;
                    // 集合长度不足的,补足.
                    string substr = ArrayToString(chs, ls_rcstr, "+"); // 其中+号不要也可的.
                    if (substr != string.Empty)
                    {
                        ls_rcstr = ls_rcstr + "," + substr;
                    }
                    // 检测是否该组合已在List中(无序检测) .具体可自行处理 
                    if ( !StrInArrayList(results, ls_rcstr))
                    {
                        results.Add(ls_rcstr);
                        Console.WriteLine(results.Count +"  "+ls_rcstr);
                    }
                    // 递归计算 
                    Get_enumList(nextprefix, dim + 1, chs, results);
                }
            }
     string ArrayToString(string[] chs, string extra_str, string spchar)
            {
                string ls_str = string.Empty;
                string[] extrastrs = extra_str.Split(',');
                foreach (string s in chs)
                {
                    if (extrastrs.Contains<string>(s))
                        continue;
                    if (ls_str == string.Empty)
                        ls_str = s;
                    else
                        ls_str = ls_str + spchar + s;
                }
                return ls_str;
            } bool StrInArrayList( List<string> chs, string s)
            {
                foreach (string substr in chs)
                {
                    if (StringLike(substr, s))
                        return true;
                }
                return false;
            }
     bool StringLike(string chs, string s)
            {
                string[] as_str1 = chs.Split(',');
                string[] as_str2 = s.Split(',');
                if (as_str1.Length != as_str2.Length)
                    return false;
                int likecount = 0;
                foreach (string substr in as_str1)
                {
                    if (substr.Contains('+'))
                    {
                        // 此处代码待处理
                        continue;
                    }
                    else
                    {
                        if (!as_str2.Contains<string>(substr))
                            return false;
                        likecount++;
                    }
                }
                return likecount == as_str2.Length ;
            }
      

  9.   

    上面这些代码,达不到要求.
    http://www.cnblogs.com/zlinke/archive/2012/08/23/2653239.html
      

  10.   

    链接怎么做? 
    http://www.cnblogs.com/zlinke/archive/2012/08/23/2653239.html