40分求助!(3WA)
查看原帖
40分求助!(3WA)
393852
C83_AD楼主2022/7/7 21:21

题目

#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           |           |

看很久没看出来错在哪里。

2022/7/7 21:21
加载中...