OJ题目:click here~~
题意分析:为一个通信系统购置n个不同的设备。每个设备可由m个生产厂商提供,不同的生产厂商提供的相同设备的brandwidth(带宽),price(价格)不同,求配置这个n个设备的最大性价比B/P , 即带宽/价格的最大值,带宽为所选设备的带宽最小值,价格为所选设备的价格总和。显然尽量使B大,P小。
可能用分组背包做。设dp[ i ][ k ] 为购置前 i 个设备 带宽最小为 k 的最小的价格总和。
则,dp[ i ][ k ] = min(dp[ i ][ k ] , dp[ i - 1][ k ] + price[ i ][ j ]) ,其中,k <= brandwidth[ i ][ j ] 。
最后,再从所有的dp[ n ][ i ] 中 , 找出最大性价比。
AC_CODE
int main(){
int t;
//freopen("in.txt","r",stdin);
cin >> t;
while(t--)
{
int n , m;
int brandwidth[101][101];//带宽
int price[101][101];//价格
int mi[101];//第i种设备的m种选择
int dp[101][1001];//dp[ i ][ k ] 为购置前 i 个设备 带宽最小为 k 的最小的价格总和
memset(dp , 0x3f , sizeof(dp));
int i , j ,k ,maxb = -1;
cin >> n;
for(i = 1;i <= n;i++)
{
cin >> mi[i];
for(j = 1;j <= mi[i];j++)
{
cin >> brandwidth[i][j] >> price[i][j];
if(brandwidth[i][j] > maxb) maxb = brandwidth[i][j];
}
}
for(i = 1;i <= maxb;i++) dp[0][i] = 0;
for(i = 1;i <= n;i++)//n设备
for(j = 1;j <= mi[i];j++)//第i种设备的第j种选择
for(k = 1;k <= brandwidth[i][j];k++)//最小带宽小于此带宽时,才能选择此带宽
dp[i][k] = min(dp[i][k] , dp[i - 1][k] + price[i][j]);//价格和的最小值
double ans = -1;
for(i = 1;i <= maxb;i++)
ans = max(ans , 1.0*i /dp[n][i]);//找最大性价比
printf("%.3lf\n",ans);
}
return 0 ;
}