着名的exact cover problem算法由Donald Knuth提供,称为Knuth的算法X.
Input: List of subsets of a Universal sets
Output: All the possible disjoint subset whose union is Universal set
假设输入为{ab, ac, cd, c, d, a, b}
。是否可以使Knuth的算法X使其根据某个预定义的块大小给出输出。例如,如果{2, 2}
是块大小设置,它将提供输出:{ab, cd}
,如果{2,1,1}
是块大小设置,它将提供输出:{ab, c, d}
,{{ 1}}和{ac, b, d}
。
答案 0 :(得分:3)
您可以(可选)从输入列表中删除没有块大小的所有子集开始。
原始Knuth的算法X可以使用一组块大小(例如{2,1,1})作为限制使用粗体中的扩展名进行更改,如下所示:
A
为空且块大小为空,问题就解决了;终止成功。c
(确定性地)。r
,以使A[r, c] = 1
和行r
中的1个数字在块大小中(非确定性)。< / LI>
r
r
中的1个数 j
,A[r, j] = 1
,
从矩阵j
中删除列A
;
对于每个i
,A[i, j] = 1
,
从矩阵i
中删除行A
。A
和缩小的块大小上递归重复此算法。