#include<cstdio>
using namespace std;
int x,n,f,anss,ans[23],a[23],steps[23];
bool lu[23][23],vis[23];
void dfs(int x,int s,int t){
int flag=1;
for(int i=x+1;i<=n;i++) if(lu[x][i]&&!vis[i]) flag=0;
if(flag&&anss<s){
anss=s,f=t;
for(int i=1;i<=t;i++) ans[i]=steps[i];
}
if(flag) return;//这么写单纯是为了压行
for(int i=x+1;i<=n;i++){
if(lu[x][i]&&!vis[i]) steps[t+1]=i,vis[i]=1,dfs(i,s+a[i],t+1),vis[i]=0;
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++) scanf("%d",&x),lu[i][j]=x;
for(int i=1;i<=n;i++) steps[1]=i,vis[i]=1,dfs(i,a[i],i),vis[i]=0;
for(int i=1;i<=f;i++) printf("%d ",ans[i]);
printf("\n%d",anss);
}
就是一个暴搜,还打错了。。。
下了一个测试点,发现anss是对的,但是ans里多了往后的一个地窖。
如下:
//in: |//out: |//mine:
3 |2 |2 3
10 20 5 |20 |20
0 1 | |
0 | |
看很久没看出来错在哪里。