集合覆蓋是乙個組合數學和資源選擇的問題模型,主要思想是:
給定乙個集合s, a1
...a
n 為s的子集所組成的集合p,集合c就是由來自p的乙個或多個集合組成。集合c覆蓋s是指,如果s中的每乙個元素都至少包含在乙個c的子集中。此外,c包含的來自p的子集越少越好。
#include
#include
#include
"cover.h"
#include
"list.h"
#include
"set.h"
/* 從所給的子集的集合subsets中尋找最小的子集組合covering,使其能夠覆蓋全集members */
/* args:
members: 所要覆蓋的目標集合
subsets: 由members的子集所組成的集合
covering: 尋找的最小子集集合
method:
每次從subsets中尋找最大覆蓋率的子集,找到後加入到covering集合,
從members中刪除已覆蓋的元素,從subsets從刪除已加入到covering中的子集元素
*/int cover(set
*members, set
*subsets, set
*covering)
if(set_size(&intersection) > max_size)
/* 只是尋找覆蓋率最大的子集,並不使用交集 */
set_destroy(&intersection);
}//交集為空,說明無法覆蓋餘下的members元素,因此cover失敗
if(max_size ==
0) return
1; //對找到的最大覆蓋率子集進行處理
subset = (kset *)list_data(max_member);
//step1: 將子集加入到covering中
if(set_insert(covering, subset) !=
0) return-1;
//從members,subsets中刪除子集元素
for(member = list_head(&((kset *)list_data(max_member))->
set); member !=
null; member = list_next(member))
}//如果沒覆蓋完,則表明無法覆蓋
if(set_size(members) >
0) return-1;
return
0;}
C語言案例
1.水仙花數code include int main void printf 100 999有 d個水仙花數 count 2.兩個時間只差 include int main void if year1 year2 if month1 month2 第一年的是這年的多少天 switch month1...
C 語言之set用法
下面簡單總結下set容器的操作 1 set物件的定義和初始化 set物件的定義和初始化方法包括 sets sets s1 sets b,e 其中,b和e分別為迭代器的開始和結束的標記。例如 include include include using namespace std int main se...
c語言迴圈案例
do while include include int main while b 0 printf d n b 8 return 0 不管條件是否滿足都執行一次。模擬dos遊戲。include include int main while choice 1 choice 3 switch choi...