我有n个项目,我需要一个算法来制作这些项目的所有子集。
我真正需要的是一种算法,它将这n个项目的所有可能分区分成两个不相交的集合。但我认为所有可能的子集都是一个好的开始 - 然后对于每个子集我可以将所有剩余的项目放入其他不相交的集合中。
答案 0 :(得分:1)
n个项目中有2 ^ n个可能的子集(包括空项目)。
因此,您可以对范围0..2^n-1
中的所有整数进行循环,并将此范围内的每个整数M
映射到相应的子集:如果k-,则第k项是子集M
的一部分设置M
的位。
for M = 0 to 2^n-1 do
x = M
k = 0
while x <> 0 do
if (x and 1) then //check if kth bit is set in x
......
x = x >> 1 //shift right
k = k + 1
或者,您可以为相同范围创建二进制计数器 - 例如,对于集合[0 0 1 1]
,下一组将为[0 1 0 0]