• 大小: 1KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-01-02
  • 语言: C/C++
  • 标签: c++  回溯  

资源简介

给定1个1000行×20列的0-1矩阵,对于该矩阵的任意1列,其中值为1的元素的数量不超过10%。设有两个非空集合A和B,每个集合由矩阵的若干列组成。集合A和B互斥是指对于矩阵的任意一行,同时满足下列2个条件:1)若A中有一个或多个元素在这一行上的值是1,则B中的元素在这一行全部是0;2)若B中有一个或多个元素在这一行上的值是1,则A中的元素在这一行全部是0。请你设计一个算法,找出一对互斥集合A和B,使得A和B包含的列的总数最大。

资源截图

代码片段和文件信息

#include
#include
#include
#define N 6
#define M 5
using namespace std;
int a[N][M]={ 
{1 0 0 0 1}
{0 1 0 1 0}
{0 0 1 0 0}
{0 0 1 0 0}
{0 0 1 0 0}
{0 0 0 1 1} } ;
int aa[M]bb[M]bestA[M]bestB[M];
bool b[M][M];
int an=0bn=0count=0bestan=0bestbn=0;

void find(int d)
{
int ij;
bool flagaflagb;
flaga=true;flagb=true;//能否加入A或B的标志 

if((an+bn>count)&&an&&bn)
{
count=an+bn;
bestan=an;bestbn=bn;
for(int i=0;i for(int i=0;i }

if(d>=M) return;

//都不加 
find(d+1);

//判断能否加入A
for(j=0;j if((d!=bb[j])&&(!b[bb[j]][d])) flaga=false;
if(flaga)

评论

共有 条评论