提交时间:2024-10-02 15:20:14

运行 ID: 32934

#include<bits/stdc++.h> #define int long long #define doub long double using namespace std; const int maxn=67; const doub eps=1e-9; int n,m; bool ch[maxn]; int a[maxn]; vector<int> E[maxn]; bool leq(doub x,doub y){ return x-y<eps; } doub ans=0; void DFS(int t,int S1,int S2){ if(t==n+1){ if(S1==0&&S2==0)return; if(leq(1.0*S1*S1/S2,ans))return; for(int i=1;i<=n;i++){ if(!ch[i])continue; for(auto x:E[i])if(!ch[x])return; } if(leq(ans,1.0*S1*S1/S2))ans=1.0*S1*S1/S2; return; } DFS(t+1,S1,S2); // for(auto x:E[t]){ // if(x<t&&!ch[x])return; // } ch[t]=1; DFS(t+1,S1+a[t],S2+a[t]*a[t]); ch[t]=0; } int dp[67][60007]; void DP(){ memset(dp,0x3f,sizeof(dp)); dp[0][0]=0; int S=0; for(int i=1;i<=n;i++)S+=a[i]; for(int i=1;i<=n;i++){ for(int j=0;j<=S;j++)dp[i][j]=dp[i-1][j]; for(int j=a[i];j<=S;j++)dp[i][j]=min(dp[i][j],dp[i-1][j-a[i]]+a[i]*a[i]); } for(int i=1;i<=S;i++){ if(leq(ans,1.0*i*i/dp[n][i]))ans=1.0*i*i/dp[n][i]; } } signed main(){ // freopen("sale.in","r",stdin); cin>>n>>m; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=m;i++){ int u,v; cin>>u>>v; E[u].push_back(v); } if(n<=26)DFS(1,0,0); else if(!m)DP(); cout<<fixed<<setprecision(12)<<ans<<endl; }