#include<iostream>
#include<iomanip>
#include<cstdio>
using namespace std;
#define inf 0x3f3f3f3f
int dp[10000][10000];
int min(int a,int b)
{
if(a>=b)
return b;
else
return a;
}
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
int i,j;
for(i=1;i<=n;i++) //初始化 ,都赋给最大值
{
for(j=1;j<=10000;j++)
{
dp[i][j]=inf;
}
}
for(i=1;i<=n;i++)
{
int m,band,price,k;
cin>>m;
while(m--)
{
cin>>band>>price;
if(i==1) /* 当遍历第一组是,将p赋给dp[1][band]; dp[1][band]为带宽为band的所用的价钱 */
{
dp[1][band]=min(dp[1][band],price);
}
else /*当遍历第二组是*/
{
for(k=1;k<=10000;k++)
{
if(dp[i-1][k]!=inf) //找出前一组遍历过的dp[i-1][k];
{
if(k<=band) //如果前一组的band值k 小于这组的band值 band
{
dp[i][k]=min(dp[i][k],dp[i-1][k]+price); //就找出dp[i][k]和(前一组的dp[i-1][k]加上这组价格price)的最小值 ,并赋给 dp[i][k]
}
else //这组的band值 band 小于如果前一组的band值k, 就找出dp[i][band]和(前一组的dp[i-1][k]加上这组价格price)的最小值 ,并赋给 dp[i][band]
{
dp[i][band]=min(dp[i][band],dp[i-1][k]+price);
}
}
}
}
}
}
double ans;
double sum=0;
for(i=1;i<=10000;i++)
{
if(dp[n][i]!=inf)
{
ans=(double)i/dp[n][i];
if(ans>sum)
{
sum=ans;
}
}
}
printf("%.3f\n",sum);
}
}
动态规划之带宽与价格
最新推荐文章于 2020-04-09 07:59:47 发布