poj1018Communication System dp

//一个系统需要n个设备,每个设备有不同的生产厂家,不同的厂家的设备的性能和价格不同
//现在问要这个系统的B/P的最大值,B是N个设备性能最差的性能,P是n个设备的价格
//dp[i][j] 表示前i个设备的性能大于等于j的最少价格
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 110 ;
const int inf = 0x7fffffff ;
int dp[maxn][maxn*10] ;
int c[maxn][maxn] ;
int v[maxn][maxn] ;
int len[maxn] ;
int  n ;
int main()
{
  // freopen("in.txt" ,"r" , stdin) ;
    int t ;
    scanf("%d" , &t) ;
    while(t--)
    {
        scanf("%d"  , &n) ;
        int ma = 0 ;
        for(int i = 1;i <= n;i++)
        {
            scanf("%d" , &len[i]) ;
            for(int j = 1;j <= len[i] ; j++)
            {
                scanf("%d%d" , &c[i][j] , &v[i][j]) ;
                ma = max(c[i][j]  , ma) ;
            }
        }
        memset(dp , 0 , sizeof(dp)) ;
        for(int i = 1;i <= n;i++)
        {
            for(int j = 0 ;j <= ma ;j++)
            {
                if(dp[i-1][j] == inf)
                {
                    dp[i][j] = inf;
                    continue ;
                }
                int mi = inf ;
                for(int k = 1;k <= len[i];k++)
                if(c[i][k] >= j)
                mi = min(v[i][k] , mi) ;
                if(mi == inf){dp[i][j] = inf ;continue ;}
                dp[i][j] = dp[i-1][j] + mi ;
            }
        }
        double ans = 0 ;
        for(int i = 1;i <= ma;i++)
        ans = max(ans , (double)i/(double)dp[n][i]) ;
        printf("%.3lf\n" , ans) ;
    }
    return 0 ;
}



你可能感兴趣的:(dp)