分数规划 0pts求调 代码可读性高
  • 板块P1642 规划
  • 楼主zhouxianzhuo
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/8/15 19:18
  • 上次更新2024/8/15 19:49:39
查看原帖
分数规划 0pts求调 代码可读性高
1020186
zhouxianzhuo楼主2024/8/15 19:18

思路:将产量*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;
}
2024/8/15 19:18
加载中...