思路:将产量*100,后用整数进行分数规划
#include<bits/stdc++.h>
using namespace std;
int n,m,w[110],c[110],siz[110];
int hd[110],ne[110],to[110],tot;
long long v[110],f[110][110];
void add(int x,int y){
tot+=1;
ne[tot]=hd[x];
hd[x]=tot;
to[tot]=y;
}
void dfs(int x,int fa){
siz[x]=1;
f[x][1]=v[x];
for(int i=hd[x];i>=1;i=ne[i])
{
if(to[i]==fa)continue;
dfs(to[i],x);
for(int j=min(siz[x],m);j>=1;j--)
{
for(int k=1;k<=siz[to[i]]&&j+k<=m;k++)
f[x][j+k]=max(f[x][j+k],f[x][j]+f[to[i]][k]);
}
siz[x]+=siz[to[i]];
}
}
bool check(int x){
for(int i=1;i<=n;i++)
v[i]=w[i]-(long long)c[i]*x;
memset(f,0,sizeof(f));
dfs(1,0);
for(int i=1;i<=n;i++)
if(f[i][m]>0)return true;
return false;
}
int main(){
scanf("%d%d",&n,&m);
m=n-m;
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
w[i]*=100;
}
for(int i=1;i<=n;i++)
scanf("%d",&c[i]);
for(int i=1;i<=n-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
int l=0,r=1e9;
while(l+1<r)
{
int mid=(l+r)>>1;
if(check(mid))l=mid;
else r=mid;
}
printf("%.1lf",l/100.0);
return 0;
}