你这用的回溯法
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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)