程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 精確覆蓋問題的回溯算法(一)——問題描述

精確覆蓋問題的回溯算法(一)——問題描述

編輯:C++入門知識

一、問題描述

精確覆蓋問題(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. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved