c# 回溯法 求含n个元素的集合的幂集
比如A={1,2,3},那么A的幂集为P(A)={{1,2,3},{1,2},{1,3},{1},{2,3},{2},{3},{空}}
class Program { static void Main(string[] args) { ArrayList A = new ArrayList(); A.Add("1"); A.Add("2"); A.Add("3"); A.Add("4"); ArrayList B = new ArrayList(); B.Add("0"); B.Add("0"); B.Add("0"); B.Add("0"); B.Add("0"); Program p = new Program(); p.GetPowerSet(0,A,B); Console.ReadKey(); } /// <summary> /// 算出幂集合输出 /// </summary> /// <param name="i"></param> /// <param name="A"></param> /// <param name="B"></param> void GetPowerSet(int i, ArrayList A, ArrayList B) { if (i == A.Count) { Output(B); } else { string x = GetElem(A, i); int k = GetLength(B); B.Insert(k, x); GetPowerSet(i + 1, A, B); B.RemoveAt(k); GetPowerSet(i + 1, A, B); } } /// <summary> /// 输出其中的一个幂集 /// </summary> /// <param name="B"></param> void Output(ArrayList B) { foreach (var b in B) { Console.Write(" " + b.ToString()); } Console.WriteLine(); } /// <summary> /// 得到一个A集合中的一个集 /// </summary> /// <param name="A"></param> /// <param name="i"></param> /// <returns></returns> string GetElem(ArrayList A, int i) { return A[i].ToString(); } /// <summary> /// 这个是为了排除0的长度 /// </summary> /// <param name="A"></param> /// <returns></returns> int GetLength(ArrayList A) { int i = 0; foreach (string a in A) { if (a != "0") { i++; } } return i; } }
浙公网安备 33010602011771号