向各位大侠求救:
现有一个集合如:{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
.....
此算法如何写? 在线等...
现有一个集合如:{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
.....
此算法如何写? 在线等...
http://www.cnblogs.com/rogerwei/archive/2010/11/18/1880336.html
如 0个"," 的时候 就是 原来的 ,一个的时候就
for(int i=1;i<string.lengthg; i++)
{ string.addat(i,",") };
这个一个一个的去枚举吧.
{
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();
}
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++;
}
}
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()都来了
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 ;
}
http://www.cnblogs.com/zlinke/archive/2012/08/23/2653239.html
http://www.cnblogs.com/zlinke/archive/2012/08/23/2653239.html