初级光能
bool ok(int t)
{ for(int i=1;i<=n;i++)
{
if(g[t][i]&&now[i]==1)
{
return false;
}
}
return true;
}
void dfs(int t,int sum)
{
if(t>n)
{
if(sum>ans)
{
ans=sum;
memcpy(best,now,sizeof(now));
}
return;
}
if(ok(t))
{
now[t]=1;
dfs(t+1,sum+1);
now[t]=0;
}
dfs(t+1,sum);
bool ok(int t)
{ for(int i=1;i<=n;i++)
{
if(g[t][i]&&now[i]==1)
{
return false;
}
}
return true;
}
void dfs(int t,int sum)
{
if(t>n)
{
if(sum>ans)
{
ans=sum;
memcpy(best,now,sizeof(now));
}
return;
}
if(ok(t))
{
now[t]=1;
dfs(t+1,sum+1);
now[t]=0;
}
dfs(t+1,sum);
bool ok(int t)
{ for(int i=1;i<=n;i++)
{
if(g[t][i]&&now[i]==1)
{
return false;
}
}
return true;
}
void dfs(int t,int sum)
{
if(t>n)
{
if(sum>ans)
{
ans=sum;
memcpy(best,now,sizeof(now));
}
return;
}
if(ok(t))
{
now[t]=1;
dfs(t+1,sum+1);
now[t]=0;
}
dfs(t+1,sum);
资深天翼
就是先用一个布尔型的b二维数组,来存储个个人之间的关系,如1,2是仇敌关系,那么b[1,2]就为true,用一个循环。
然后搜索
搜索条件
枚举每个人
如果之前没有别选过且与选过的人没有仇敌关系,就入选队伍(所谓的队伍就是一个数组)。
Pascal代码(没有写c++的,不知你学过没)
procedure search(t,s:longint); var i:longint; begin if t>m then begin if s>max then begin max:=s; d:=b; end; exit; end; if pd(t) then begin b[t]:=1; search(t+1,s+1); b[t]:=0;end; b[t]:=0; search(t+1,s); end;
pd函数
function pd(t:longint):boolean; var i:longint; begin if t=1 then exit(true); for i:=1 to t-1 do if (c[i,t]=false)and(b[i]=1) then exit(false); exit(true); end;
资深光能
void flag(int x,int tot)
{
if(x>n)
{
if(tot>send)
{
send=tot;
memcpy(end,use,n+1);
}
return;
}
if(!can[x] && !use[x])
{
use[x]=true;
bool now[105];
memcpy(now,can,n+1);
for(int j=0;j<vec[x].s;j++)
can[vec[x].other[j]]=true;
flag(x+1,tot+1);
use[x]=false;
memcpy(can,now,n+1);
}
flag(x+1,tot);
}