c#求幂集

c#求幂集,第1张

你这用的回溯法

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)

每次先左加再右去,相当于在A的基础腊稿弊上每次左右移动一位,B就是移动后的结果,移到最后B就是空了,也就是最后那个{空}。

你要想记录轮族最后的结果,那你还得引入第三个集合C。

修改后如下:

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()

List<ArrayList> C = new List<ArrayList>() // 结果集

Program p = new Program()

p.GetPowerSet(0, A, B, ref C)

Console.WriteLine(C.Count)

Console.ReadLine()

}

void GetPowerSet(int i, ArrayList A, ArrayList B, ref List<ArrayList> C)

{

if (i == A.Count)

{

C.Add(B)

}

else

{

string x = GetElem(A, i)

int k = GetLength(B)

B.Insert(k, x)

GetPowerSet(i + 1, A, B, ref C)

B.RemoveAt(k)

GetPowerSet(i + 1, A, B, ref C)

}

}

string GetElem(ArrayList A, int i)

{

return A[i].ToString()

}

int GetLength(ArrayList A)

{

int i = 0

foreach (string a in A)

{

if (a != "0")

{

i++

}

}

return i

}

穷举即可,对于任意一个该集合的元素,有两种选择,即加入或不加入,这样就可以穷举出所有的集合,用C语言简单写下:带颂

//假设a[10]是一个含10整数元素的集合

byte b[10]={0,0,0,0,0,0,0,0,0,0}//设一个指标数组,若为蠢唯郑1,山伍则输出a对应的元素,若为0,则不输出

for(j=0j<1024j++)

{

printf("第%d个幂集是\n{ ",j+1)

for(i=0i<10i++)

{

if(b[i]==1) printf("%d",a[i])

}

printf("}\n")

for(k=9k>=0k--)

{

if(b[k]==0) {b[k]=1break}

else b[k]=0

}

}

你可以跑下面的一段经过调试后的包含3元素的C语言程序:

int main( )

{

int i,j,k

int a[3]={1,2,3}

int b[3]={0,0,0}

for(j=0j<8j++)

{

printf("第%d个幂集是\n{ ",j+1)

for(i=0i<3i++)

{

if(b[i]==1) printf("%d ",a[i])

}

printf("}\n")

for(k=2k>=0k--)

{

if(b[k]==0) {b[k]=1break}

else b[k]=0

}

}

scanf("%d",&i)

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12353566.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存