精确覆盖问题的回溯算法(一)——问题描述

一、问题描述

精确覆盖问题(Exact Cover Problem),是指给定了一个全集S以及它的m个子集S1、S2、..Sm以后,要求出一组子集,使这组子集的并等于原来的全集S,且各子集两两不交。

例:设

S={1,2,3,4,5,6,7},

A={1,4,7},

B={1,4},

C={4,5,7},

D={3,5,6},

E={2,3,6,7}

,F={2,7}

则子集组{B,D,F}就是S的一个精确覆盖,因为有B∪D∪F=S,

且B∩D=∅,B∩F=∅,D∩F=∅。

精确覆盖问题的等价描述是:给定全集S,设其幂集(也就是所有子集的集合)为P(S),再给定一个P(S)的非空子集A,

要求出A的一个子集B(注意这个B的每个元素都是S的子集),满足:对全集S中的任何一个元素x,它都恰好只属于B的某个元素而不属于B的其他元素。

 

二、子集的矩阵表达形式

设全集S有n个元素,给定m个子集以后,我们可以构造出一个m*n的矩阵A,这个矩阵的行标题为子集的名称,列标题是全集中的每个元素。

如果矩阵元素A(m,n)的值为1,则表示元素n属于子集m,为0时表示n不属于子集m。对前面所给的例子,所构造的矩阵为

     1  2   3   4  5  6  7

A  1   0   0  1  0  0  1 

B  1   0   0  1  0  0  0

C  0   0   0  1 1  0   1

D  0   0   1  0 1  1   0

E  0   1   1  0  0  1  1

F  0   1    0  0  0  0  1

 

于是,现在问题转化成,要选出这个矩阵的某些行,使在由这些所选行所构成的新矩阵中,每一列都恰好只有一个1。比如

{B,D,F}这个子集组所对应的3行所构成的新矩阵为

     1  2   3   4  5  6  7

B  1   0   0  1  0  0   0

D  0   0   1  0  1  1   0

F   0   1    0  0  0  0   1

可以看出,在这个新矩阵中,每一列都有1,保证了子集的并等于全集,而每一列只有一个1,则意味着一个元素只出现在唯一的子集中,即各子集两两不交。

于是,{B,D,F}就是S的一个精确覆盖。这就是用矩阵描述精确覆盖问题的威力所在。

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值