题目大意:
有一个系统,这个系统由n种设备组成,现在每种设备有m个,设备有两种属性:
一个是带宽(B),一个是价格(P)。
每种设备取一个,使min(B)/sum(P)的值最大。
(整个系统的B是所有设备的B的最小值。)
(整个系统的P是所有设备的P的和。)
输入:
先输入一个T,表示有T组数据。
每组数据第一行输入n。
接下来是n行,每行先输入m,然后输入m对数。
第i对数表示n种设备的第i个设备的B和P。
思路:
动态规划。
f[i][j]表示选完前i个设备,B=j的最小花费。
代码:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define Maxp 110
#define Maxn 11000
#define Maxf 0x7fffffff
#define Mes(x,y) memset(x,y,sizeof x)
#define Sort(a,x,y,o) sort(a+x,a+x+y,o)
using namespace std;
int f[Maxp][Maxn];
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int Times;
scanf("%d",&Times);
while(Times--)
{
int n;
scanf("%d",&n);
int Max=0;
Mes(f,63);
f[0][0]=0;
for(int i=1;i<=n;i++)
{
int m;
scanf("%d",&m);
for(int j=1;j<=m;j++)
{
int x,y;
scanf("%d%d",&x,&y);
if(i==1&&f[i][x]>y)f[i][x]=y;
for(int k=1;k<=Max;k++)
{
if(f[i-1][k]>99999)continue;
int z=min(x,k);
if(f[i][z]>f[i-1][k]+y)f[i][z]=f[i-1][k]+y;
}
if(x>Max)Max=x;
}
for(int k=1;k<=Max;k++)
if(f[i][0]>f[i][k])f[i][0]=f[i][k];
}
double ans=0.0;
for(int i=1;i<=Max;i++)
{
double s=1.0*i/f[n][i];
if(s>ans)ans=s;
}
printf("%.3lf\n",ans);
}
return 0;
}