#include<bits/stdc++.h>
using namespace std;
int read(){
int x,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-1;
ch=getchar();
}
while(isdigit(ch)){
x=x*10+ch-'0';
}
return x*f;
}
int ans[25];//储存结果路径
int path[25];//储存DFS路径
bool a[25][25];//储存边是否联通
int n;//地窖个数
int num[25];//每个地窖的地雷数量
bool b[25];//检查每个点是否走过
int anw;//储存最多地雷数
int r;//储存步数
bool chek(int x){//查看是否还有可走的边
for(int i=1;i<=n;i++)
if(a[x][i]&&b[i]) return true;
return false;
}
void DFS(int x,int temp,int cnt){
/*x储存现在所在的点
cnt储存结果
temp储存步数*/
if(!chek(x)){//如果没有可走之路
if(cnt>anw){
anw=cnt;
r=temp;
for(int i=1;i<=r;i++){
ans[i]=path[i];
}
}
return ;
}
for(int i=1;i<=n;i++){
if(a[x][i]&&b[i]){
b[i]=0;//标记
path[temp+1]=i;//记录路径
DFS(i,temp+1,cnt+num[i]);
b[i]=1;//回溯
}
}
}
int main (){
memset(b,1,sizeof(b));
n=read();
for(int i=1;i<=n;i++) num[i]=read();
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++){
a[i][j]=read();
}
for(int i=1;i<=n;i++){
b[i]=0;
path[1]=i;
DFS(i,1,num[i]);
b[0]=0;
}
for(int i=1;i<=r;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
cout<<anw;
return 0;
}
超时了,不会改,求助