DFS 60分求解
  • 板块题目总版
  • 楼主zhangyips
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/8/17 20:00
  • 上次更新2024/8/17 22:22:38
查看原帖
DFS 60分求解
1398538
zhangyips楼主2024/8/17 20:00
https://www.luogu.com.cn/problem/P2196
#include<stdio.h>
const int maxn=25;
int a[maxn],b[maxn],cmp[maxn],u[maxn],f[maxn][maxn],n,maxlen,ans;
void dfs(int m,int s,int len){
	if(cmp[m]==0 || m==n+1){
		if(s>ans){
			ans=s;
			maxlen=len;
			int x=0;
			for(int i=1;i<=n;i++){
				if(u[i]){
					b[++x]=i;
				}
			}
			b[len]=m;
		}
	}else{
		for(int i=m+1;i<=n;i++){
			if(u[i] || f[m][i]==0 || (len>maxlen && s+a[i]<=ans)) continue;
			u[m]=1;
			dfs(i,s+a[i],len+1);
			u[m]=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",&f[i][j]);
			cmp[i]+=f[i][j];
		}
	}
	for(int i=0;i<=n;i++){
		if(cmp[i]){
			dfs(i,a[i],1);
		}
	}
	for(int i=1;i<=maxlen;i++){
		printf("%d ",b[i]);
	}
	printf("\n%d",ans);
	return 0;
}
2024/8/17 20:00
加载中...