60pts求调
查看原帖
60pts求调
528478
Steven_Gerrard楼主2022/9/23 12:58
#include<bits/stdc++.h>
using namespace std;
int a[21];
int n;
int m[21][21];
bool use[21];
int ans=-1e9;
int aw[21],ak[21];
int pd(int o)
{
	for(int i=1;i<=n;++i)
	{
		if(m[i][o]==1&&use[i]==0)
		{
			return false;
		}
	}
	return true;
}
void dfs(int local,int sum,int num)
{
	if(pd(local))
	{
		if(sum>ans)
		{
			memset(ak,0,sizeof(ak));
			for(int i=1;i<=num;++i)
			{
				ak[i]=aw[i];
			}
		}
		ans=max(ans,sum);
		return;
	}
	else
	{
		for(int i=1;i<=n;++i)
		{
			if(m[i][local]==1&&use[i]==0)
			{
				use[i]=1;
				aw[num]=i;
				dfs(i,sum+a[i],num+1);
				use[i]=0;
				aw[num]=0;
			}
		}
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;++i)cin>>a[i];
	memset(m,-1,sizeof(m));
	for(int i=1;i<=n-1;++i)
	{
		for(int j=i+1;j<=n;++j)
		{
			int k;
			cin>>k;
			m[i][j]=k;
			m[j][i]=k;
		}
	}
	for(int i=1;i<=n;++i)
	{
		use[i]=1;
		aw[1]=i;
		dfs(i,a[i],2);
	}
	for(int i=1;i<=20;++i)
	{
		if(ak[i]!=0)cout<<ak[i]<<" ";
	}
	cout<<endl<<ans;
}
2022/9/23 12:58
加载中...