题目大意:有n个设备,每个设备有mi中选择,选出使得B/P最大的一种,其中 B 是选出的n个设备中最小的那个,P是选出的设备的总价格。即:n个设备的带宽和价值为(Bi,Pi),B= min(Bi),P=sum(Pi);
可以得到状态转移方程为:
dp[i][j] = min(dp[i][j],dp[i-1][j]+pi);
dp[i][j]为选择第i个设备,带宽为 j 时的最小费用。
import java.util.*;
public class Main {
static final int inf = 0x3f3f3f3f;
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
int t,n,i,j;
int[][] dp = new int[120][1200];
t = in.nextInt();
while(t-- > 0)
{
n = in.nextInt();
for(i=1; i<=n; i++)
for(j=0; j<1100; j++)
dp[i][j] = inf;
for(i=1; i<=n; i++)
{
int num = in.nextInt();
for(j=1; j<=num; j++)
{
int p,b;
b = in.nextInt();
p = in.nextInt();
if(i == 1)
{
dp[1][b] = Math.min(dp[1][b],p);
}
else
{
for(int k=0; k<1100; k++)
{
if(dp[i-1][k] != inf)
{
if(k <= b)
dp[i][k] = Math.min(dp[i][k], (dp[i-1][k]+p));
else
dp[i][b] = Math.min(dp[i][b], (dp[i-1][k]+p));
}
}
}
}
}
double ans = 0;
for(i=0; i<1100; i++)
{
if(dp[n][i] != inf)
{
ans = Math.max(ans, (double)i/dp[n][i]);
}
}
System.out.printf("%.3f\n",ans);
}
}
}